1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
#include "texture.h"
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#include <iostream>
#include "../debug.h"
Texture::Texture(int width, int height, GLenum texUnit, GLint internalFormat, GLenum texTarget):
m_texTarget(texTarget),
m_texUnit(texUnit)
{
glGenTextures(1, &m_handle);
bind();
glTexParameteri(m_texTarget, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(m_texTarget, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(m_texTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(m_texTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexImage2D(m_texTarget, 0, internalFormat, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
m_height = height;
m_width = width;
unbind();
}
Texture::Texture(std::string filepath, GLenum texUnit, GLint internalFormat, GLenum texTarget):
m_texTarget(texTarget),
m_texUnit(texUnit)
{
glGenTextures(1, &m_handle);
bind();
glTexParameteri(m_texTarget, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(m_texTarget, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(m_texTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(m_texTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
stbi_set_flip_vertically_on_load(1);
int width, height, numChannels;
unsigned char* data = stbi_load(filepath.c_str(), &width, &height, &numChannels, 4);
if (stbi_failure_reason()){
std::cout << stbi_failure_reason() << std::endl;
}
glTexImage2D(m_texTarget, 0, internalFormat, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
m_height = height;
m_width = width;
stbi_image_free(data);
unbind();
}
Texture::~Texture(){
glDeleteTextures(1, &m_handle);
}
void Texture::bind(){
glActiveTexture(m_texUnit);
glBindTexture(m_texTarget, m_handle);
}
void Texture::bind(GLenum texUnit){
glActiveTexture(texUnit);
glBindTexture(m_texTarget, m_handle);
}
void Texture::unbind(){
glActiveTexture(m_texUnit);
glBindTexture(m_texTarget, 0);
}
void Texture::unbind(GLenum texUnit){
glActiveTexture(texUnit);
glBindTexture(m_texTarget, 0);
}
GLuint Texture::getHandle(){
return m_handle;
}
GLuint Texture::getTexUnitUint(){
return GLuint(m_texUnit) - GLuint(GL_TEXTURE0);
}
GLenum Texture::getTexUnitEnum(){
return m_texUnit;
}
int Texture::getWidth(){
return m_width;
}
int Texture::getHeight(){
return m_width;
}
|