/
texture.cpp
128 lines (96 loc) · 3.91 KB
/
texture.cpp
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "texture.h"
#include <time.h>
CTexture::CTexture()
{
m_bMipMapsGenerated = false;
}
int index = 0;
void CTexture::createTexStorage2D(GLubyte* bData, GLenum format, int iWidth, int iHeight, bool bGenerateMipMaps)
{
glGenTextures(1, &m_uiTexture);
glBindTexture(GL_TEXTURE_2D, m_uiTexture);
if(format == GL_RGB || format == GL_BGR) {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, iWidth, iHeight, 0, format, GL_UNSIGNED_BYTE, bData);
if(bGenerateMipMaps)glGenerateMipmap(GL_TEXTURE_2D);
} else {
glTexImage2D(GL_TEXTURE_2D, 0, format, iWidth, iHeight, 0, format, GL_UNSIGNED_BYTE, bData);
if(bGenerateMipMaps)glGenerateMipmap(GL_TEXTURE_2D);
}
glGenSamplers(1, &m_uiSampler);
m_sTexturePath = "";
m_bMipMapsGenerated = bGenerateMipMaps;
}
bool CTexture::initTexture2D(std::string sTexturePath, bool bGenerateMipMaps)
{
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
FIBITMAP* dib(0);
fif = FreeImage_GetFileType(sTexturePath.c_str(), 0); // 检查文件签名,推导其格式
if(fif == FIF_UNKNOWN) fif = FreeImage_GetFIFFromFilename(sTexturePath.c_str()); // 从扩展名猜测格式
if(fif == FIF_UNKNOWN) return false;
if(FreeImage_FIFSupportsReading(fif)) dib = FreeImage_Load(fif, sTexturePath.c_str());
if(!dib) return false;
GLubyte* bDataPointer = FreeImage_GetBits(dib);
if(bDataPointer == NULL || FreeImage_GetWidth(dib) == 0 || FreeImage_GetHeight(dib) == 0)
return false;
GLenum format = FreeImage_GetBPP(dib) == 24 ? GL_BGR : FreeImage_GetBPP(dib) == 8 ? GL_LUMINANCE : 0;
createTexStorage2D(bDataPointer, format, FreeImage_GetWidth(dib), FreeImage_GetHeight(dib), bGenerateMipMaps);
FreeImage_Unload(dib);
m_sTexturePath = sTexturePath;
return true;
}
void CTexture::createFromData(GLubyte* bData, int iWidth, int iHeight, int iBPP, GLenum format, bool bGenerateMipMaps)
{
glBindTexture(GL_TEXTURE_2D, m_uiTexture);
if(format == GL_RGB || format == GL_BGR) {
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, iWidth, iHeight, GL_BGR, GL_UNSIGNED_BYTE, bData);
if(bGenerateMipMaps)glGenerateMipmap(GL_TEXTURE_2D);
} else {
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, iWidth, iHeight, format, GL_UNSIGNED_BYTE, bData);
if(bGenerateMipMaps)glGenerateMipmap(GL_TEXTURE_2D);
}
glGenSamplers(1, &m_uiSampler);
m_sTexturePath = "";
m_bMipMapsGenerated = bGenerateMipMaps;
}
bool CTexture::loadTexture2D(std::string sTexturePath, bool bGenerateMipMaps)
{
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
FIBITMAP* dib(0);
fif = FreeImage_GetFileType(sTexturePath.c_str(), 0); // 检查文件签名,推导其格式
if(fif == FIF_UNKNOWN) fif = FreeImage_GetFIFFromFilename(sTexturePath.c_str()); // 从扩展名猜测格式
if(fif == FIF_UNKNOWN) return false;
//clock_t begin = clock();
if(FreeImage_FIFSupportsReading(fif)) dib = FreeImage_Load(fif, sTexturePath.c_str());
if(!dib) return false;
//clock_t end = clock();
//cout << end - begin << endl;
GLubyte* bDataPointer = FreeImage_GetBits(dib);
if(bDataPointer == NULL || FreeImage_GetWidth(dib) == 0 || FreeImage_GetHeight(dib) == 0)
return false;
GLenum format = FreeImage_GetBPP(dib) == 24 ? GL_BGR : FreeImage_GetBPP(dib) == 8 ? GL_LUMINANCE : 0;
createFromData(bDataPointer,
FreeImage_GetWidth(dib), FreeImage_GetHeight(dib), FreeImage_GetBPP(dib), format, bGenerateMipMaps);
FreeImage_Unload(dib);
m_sTexturePath = sTexturePath;
return true;
}
void CTexture::setSamplerParameter(GLenum parameter, GLenum value)
{
glSamplerParameteri(m_uiSampler, parameter, value);
}
void CTexture::setFiltering(int tfMagnification, int tfMinification)
{
glSamplerParameteri(m_uiSampler, GL_TEXTURE_MAG_FILTER, tfMagnification); // 设置放大滤波器
glSamplerParameteri(m_uiSampler, GL_TEXTURE_MIN_FILTER, tfMinification); // 设置缩小滤波器
}
void CTexture::bindTexture(int iTextureUnit)
{
glActiveTexture(GL_TEXTURE0+iTextureUnit);
glBindTexture(GL_TEXTURE_2D, m_uiTexture);
glBindSampler(iTextureUnit, m_uiSampler);
}
CTexture::~CTexture()
{
glDeleteSamplers(1, &m_uiSampler);
glDeleteTextures(1, &m_uiTexture);
}