我正在设置一个硬编码纹理,以用作OpenGL应用程序的调试纹理。定义它的函数是:
void Texture::initDebugTexture(void)
{
unsigned char pixels[] = {
255, 0, 255,
0, 255, 255,
255, 0, 255,
0, 255, 255
};
debug.loadPixels(2, 2, GL_RGB, GL_UNSIGNED_BYTE, pixels);
debug.setFiltering(GL_LINEAR_MIPMAP_LINEAR, GL_NEAREST);
}
loadPixels
扩展为:void Texture::loadPixels(int width, int height, GLenum colorFormat, GLenum type, void* pixels)
{
clean();
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, colorFormat, width, height, 0, colorFormat, type, pixels);
glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
}
setFiltering
很简单:void Texture::setFiltering(GLenum filterMin, GLenum filterMag, float aniso = 0.0f)
{
bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterMin);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterMag);
if (aniso != 0.0f)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
}
在
initDebugTexture
中,我尝试创建一个具有洋红色/青色方格图案的简单2x2纹理,以使它永远不会被误认为是真实纹理。不幸的是,事实并非如此,相反,我得到了:这里发生了什么事?那桃红色的部分很奇怪,它可能从哪里来?
最佳答案
Althouh,您已经在评论中提到了如何解决该问题,我想我可以在这里解释出什么问题了:
我忽略了alignmet。默认情况下,GL希望每一行在4字节边界上对齐,因此GL实际读取的数据不是您期望的,并且
[255, 0, 255], [0, 255, 255], [255,0,255], [0,255,255]
成为
[255, 0, 255], [0, 255, 255], ___ ___ [255, 0, 255] [255, U, U]
(
U
表示未定义)。根据GL的要求正确对齐数据,或通过
GL_UNPACK_ALIGNMENT
设置glPixelStore
:glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
在指定纹理数据之前。