SleakEngine 1.0.0
C++23 multi-backend game engine
Loading...
Searching...
No Matches
OpenGLTexture.cpp
Go to the documentation of this file.
2#include <Core/Logger.hpp>
3#include <stb_image.h>
4
5namespace Sleak {
6namespace RenderEngine {
7
9
11 if (m_texture != 0) {
12 glDeleteTextures(1, &m_texture);
13 m_texture = 0;
14 }
15}
16
17bool 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
43bool 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),
56 stbi_image_free(pixels);
57 return result;
58}
59
60void OpenGLTexture::Bind(uint32_t slot) const {
61 glActiveTexture(GL_TEXTURE0 + slot);
62 glBindTexture(GL_TEXTURE_2D, m_texture);
63}
64
66 glBindTexture(GL_TEXTURE_2D, 0);
67}
68
70 m_filter = filter;
71 glBindTexture(GL_TEXTURE_2D, m_texture);
72 switch (filter) {
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;
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;
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;
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
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
118 glBindTexture(GL_TEXTURE_2D, m_texture);
119 GLenum mode = GL_REPEAT;
120 switch (wrapMode) {
122 mode = GL_CLAMP_TO_EDGE; break;
124 mode = GL_CLAMP_TO_BORDER; break;
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
int width
int height
#define SLEAK_ERROR(...)
Definition Logger.hpp:22
void SetFilter(TextureFilter filter) override
void SetLodBias(float bias) override
void Bind(uint32_t slot=0) const override
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.
void SetWrapMode(TextureWrapMode wrapMode) override
bool LoadFromFile(const std::string &filePath) override
Decodes an image file and uploads it as a new GL texture.
TextureFormat
Definition Texture.hpp:10
TextureFilter
Definition Texture.hpp:28
TextureWrapMode
Definition Texture.hpp:43
Backend-facing rendering layer shared by the four graphics backends.
Root namespace for everything the engine exposes.
Definition Camera.hpp:10