OpenGL 纹理未按定义显示
Posted
技术标签:
【中文标题】OpenGL 纹理未按定义显示【英文标题】:OpenGL texture not appearing as defined 【发布时间】:2014-02-25 05:10:07 【问题描述】:我正在设置一个硬编码纹理以用作我的 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 纹理,这样它就不会被误认为是真正的纹理。不幸的是,这不是发生的事情,而是我得到了这个:
这里发生了什么?那个桃色的部分很奇怪,哪里来的?
【问题讨论】:
你的u/v
s 是什么?当您使用重复的纹理时会发生什么,例如u/v
s 从 0.0 到 4.0?是否禁用了自动生成 mipmap?你有任何 GL 错误吗?如果您以不同方式指定每个像素(红、蓝、绿、灰)会怎样?
当我将颜色设置为 [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0)] 时,我结束up with:左上象限为白色,右上象限为青色,左下象限为红色,右下象限为绿色。当我将 uv 的范围设置为 0 到 4 而不是 0 到 1 时,它按预期缠绕了 4 次。
我认为它以错误但始终错误的颜色环绕 4 次。显然颜色是混合的。可能在glTexImage2D
步骤中。你试过GL_RGBA吗? pixels
的阅读顺序是否与您预期的不同?还是越界?
对于它的价值,您的pixels
数组不会产生棋盘格 - 它会产生洋红色条纹和青色条纹。您需要交换 2 个像素。
尝试将内部格式显式设置为 GL_RGBA8,而不是对两个值都使用 colorFormat 参数。此外,请确保在初始化纹理后解除绑定。如果您将其绑定,则其他方法可能会使用纹理功能并对其产生影响。
【参考方案1】:
虽然你已经提到你是如何在 cmets 中解决这个问题的,但我想我可以在这里解释一下出了什么问题:
我忽略了对齐。默认情况下,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 的预期,要么通过 glPixelStore
设置 GL_UNPACK_ALIGNMENT
:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
在指定纹理数据之前。
【讨论】:
以上是关于OpenGL 纹理未按定义显示的主要内容,如果未能解决你的问题,请参考以下文章