SleakEngine
0.1.0
C++23 multi-backend game engine
Toggle main menu visibility
Loading...
Searching...
No Matches
OpenGLTexture.cpp
Go to the documentation of this file.
1
#include "
../../include/private/Graphics/OpenGL/OpenGLTexture.hpp
"
2
#include <
Core/Logger.hpp
>
3
#include <stb_image.h>
4
5
namespace
Sleak
{
6
namespace
RenderEngine
{
7
8
OpenGLTexture::OpenGLTexture
() {}
9
10
OpenGLTexture::~OpenGLTexture
() {
11
if
(m_texture != 0) {
12
glDeleteTextures(1, &m_texture);
13
m_texture = 0;
14
}
15
}
16
17
bool
OpenGLTexture::LoadFromMemory
(
const
void
* data, uint32_t
width
,
18
uint32_t
height
,
TextureFormat
format) {
19
m_width =
width
;
20
m_height =
height
;
21
m_format = format;
22
23
glGenTextures(1, &m_texture);
24
glBindTexture(GL_TEXTURE_2D, m_texture);
25
26
GLenum glFormat = GL_RGBA;
27
if
(format ==
TextureFormat::RGB8
) glFormat = GL_RGB;
28
29
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
width
,
height
, 0, glFormat,
30
GL_UNSIGNED_BYTE, data);
31
glGenerateMipmap(GL_TEXTURE_2D);
32
33
// Default: trilinear (good quality baseline)
34
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
35
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
36
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
37
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
38
39
glBindTexture(GL_TEXTURE_2D, 0);
40
return
true
;
41
}
42
43
bool
OpenGLTexture::LoadFromFile
(
const
std::string& filePath) {
44
int
w, h, channels;
45
stbi_set_flip_vertically_on_load(
true
);
46
unsigned
char
* pixels = stbi_load(filePath.c_str(), &w, &h, &channels, 4);
47
if
(!pixels) {
48
SLEAK_ERROR
(
"OpenGLTexture: Failed to load image: {}"
,
49
filePath);
50
return
false
;
51
}
52
53
bool
result =
LoadFromMemory
(pixels,
static_cast<
uint32_t
>
(w),
54
static_cast<
uint32_t
>
(h),
55
TextureFormat::RGBA8
);
56
stbi_image_free(pixels);
57
return
result;
58
}
59
60
void
OpenGLTexture::Bind
(uint32_t slot)
const
{
61
glActiveTexture(GL_TEXTURE0 + slot);
62
glBindTexture(GL_TEXTURE_2D, m_texture);
63
}
64
65
void
OpenGLTexture::Unbind
()
const
{
66
glBindTexture(GL_TEXTURE_2D, 0);
67
}
68
69
void
OpenGLTexture::SetFilter
(
TextureFilter
filter) {
70
m_filter = filter;
71
glBindTexture(GL_TEXTURE_2D, m_texture);
72
switch
(filter) {
73
case
TextureFilter::Nearest
:
74
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
75
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
76
break
;
77
case
TextureFilter::Bilinear
:
78
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
79
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
80
break
;
81
case
TextureFilter::Trilinear
:
82
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
83
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
84
break
;
85
case
TextureFilter::Anisotropic2x
:
86
case
TextureFilter::Anisotropic4x
:
87
case
TextureFilter::Anisotropic8x
:
88
case
TextureFilter::Anisotropic16x
: {
89
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
90
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
91
float
aniso = 1.0f;
92
if
(filter ==
TextureFilter::Anisotropic2x
) aniso = 2.0f;
93
else
if
(filter ==
TextureFilter::Anisotropic4x
) aniso = 4.0f;
94
else
if
(filter ==
TextureFilter::Anisotropic8x
) aniso = 8.0f;
95
else
if
(filter ==
TextureFilter::Anisotropic16x
) aniso = 16.0f;
96
float
maxSupported;
97
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY, &maxSupported);
98
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY,
99
aniso < maxSupported ? aniso : maxSupported);
100
break
;
101
}
102
default
:
103
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
104
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
105
break
;
106
}
107
glBindTexture(GL_TEXTURE_2D, 0);
108
}
109
110
void
OpenGLTexture::SetLodBias
(
float
bias) {
111
m_lodBias = bias;
112
glBindTexture(GL_TEXTURE_2D, m_texture);
113
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, bias);
114
glBindTexture(GL_TEXTURE_2D, 0);
115
}
116
117
void
OpenGLTexture::SetWrapMode
(
TextureWrapMode
wrapMode) {
118
glBindTexture(GL_TEXTURE_2D, m_texture);
119
GLenum mode = GL_REPEAT;
120
switch
(wrapMode) {
121
case
TextureWrapMode::ClampToEdge
:
122
mode = GL_CLAMP_TO_EDGE;
break
;
123
case
TextureWrapMode::ClampToBorder
:
124
mode = GL_CLAMP_TO_BORDER;
break
;
125
case
TextureWrapMode::Mirror
:
126
mode = GL_MIRRORED_REPEAT;
break
;
127
default
:
128
mode = GL_REPEAT;
break
;
129
}
130
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, mode);
131
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, mode);
132
glBindTexture(GL_TEXTURE_2D, 0);
133
}
134
135
}
// namespace RenderEngine
136
}
// namespace Sleak
width
int width
Definition
Application.cpp:40
height
int height
Definition
Application.cpp:41
Logger.hpp
SLEAK_ERROR
#define SLEAK_ERROR(...)
Definition
Logger.hpp:22
OpenGLTexture.hpp
Sleak::RenderEngine::OpenGLTexture::SetFilter
void SetFilter(TextureFilter filter) override
Definition
OpenGLTexture.cpp:69
Sleak::RenderEngine::OpenGLTexture::SetLodBias
void SetLodBias(float bias) override
Definition
OpenGLTexture.cpp:110
Sleak::RenderEngine::OpenGLTexture::Bind
void Bind(uint32_t slot=0) const override
Definition
OpenGLTexture.cpp:60
Sleak::RenderEngine::OpenGLTexture::LoadFromMemory
bool LoadFromMemory(const void *data, uint32_t width, uint32_t height, TextureFormat format) override
Uploads raw pixel data as a new GL texture, generating mips.
Definition
OpenGLTexture.cpp:17
Sleak::RenderEngine::OpenGLTexture::~OpenGLTexture
~OpenGLTexture() override
Definition
OpenGLTexture.cpp:10
Sleak::RenderEngine::OpenGLTexture::Unbind
void Unbind() const override
Definition
OpenGLTexture.cpp:65
Sleak::RenderEngine::OpenGLTexture::SetWrapMode
void SetWrapMode(TextureWrapMode wrapMode) override
Definition
OpenGLTexture.cpp:117
Sleak::RenderEngine::OpenGLTexture::OpenGLTexture
OpenGLTexture()
Definition
OpenGLTexture.cpp:8
Sleak::RenderEngine::OpenGLTexture::LoadFromFile
bool LoadFromFile(const std::string &filePath) override
Decodes an image file and uploads it as a new GL texture.
Definition
OpenGLTexture.cpp:43
Sleak::TextureFormat
TextureFormat
Definition
Texture.hpp:10
Sleak::TextureFilter
TextureFilter
Definition
Texture.hpp:28
Sleak::TextureWrapMode
TextureWrapMode
Definition
Texture.hpp:43
Sleak::TextureFormat::RGB8
@ RGB8
Definition
Texture.hpp:12
Sleak::TextureFormat::RGBA8
@ RGBA8
Definition
Texture.hpp:11
Sleak::TextureFilter::Anisotropic8x
@ Anisotropic8x
Definition
Texture.hpp:34
Sleak::TextureFilter::Anisotropic2x
@ Anisotropic2x
Definition
Texture.hpp:32
Sleak::TextureFilter::Nearest
@ Nearest
Definition
Texture.hpp:29
Sleak::TextureFilter::Anisotropic4x
@ Anisotropic4x
Definition
Texture.hpp:33
Sleak::TextureFilter::Trilinear
@ Trilinear
Definition
Texture.hpp:31
Sleak::TextureFilter::Bilinear
@ Bilinear
Definition
Texture.hpp:30
Sleak::TextureFilter::Anisotropic16x
@ Anisotropic16x
Definition
Texture.hpp:35
Sleak::TextureWrapMode::Mirror
@ Mirror
Definition
Texture.hpp:47
Sleak::TextureWrapMode::ClampToEdge
@ ClampToEdge
Definition
Texture.hpp:45
Sleak::TextureWrapMode::ClampToBorder
@ ClampToBorder
Definition
Texture.hpp:46
Sleak::RenderEngine
Backend-facing rendering layer shared by the four graphics backends.
Definition
Application.hpp:60
Sleak
Root namespace for everything the engine exposes.
Definition
Camera.hpp:10
src
Graphics
OpenGL
OpenGLTexture.cpp
Generated on
for SleakEngine by
1.18.0