我正在尝试在OpenGL中找出纹理映射,但我无法得到一个简单的例子。
正在绘制多边形,虽然它没有纹理但只是纯色。此位图正在正确加载到sprite1 []中,因为我现在已成功使用glDrawPixels。
我使用glGenTextures获取我的tex名称,但我注意到它不会改变texName1;即使在调用glGenTextures之后,这个GLuint也是我初始化的东西......
我启用了GL_TEXTURE_2D。
下面是代码:
GLuint texName1 = 0;
glGenTextures(1, &texName1);
glBindTexture(GL_TEXTURE_2D, texName1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, sprite1[18], sprite1[22], 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, &sprite1[54]);
glColor3f(1, 1, 0);
glBindTexture(GL_TEXTURE_2D, texName1);
glBegin(GL_QUADS);
glTexCoord2f (0.0, 0.0);
glVertex3f (0.0, 0.0, -5.0f);
glTexCoord2f (1.0, 0.0);
glVertex3f (.5, 0.0, -5.0f);
glTexCoord2f (1.0, 1.0);
glVertex3f (.5, .5, -5.0f);
glTexCoord2f (0.0, 1.0);
glVertex3f (0.0, .5, -5.0f);
glEnd();
更新: 我不知所措。这是我尝试过的一切:
原来我在初始化OGL之前初始化我的纹理。纹理在类构造函数中初始化(glGenTextures-> glTexImage2D),并在每个帧调用的成员函数中绘制(glBegin-> glEnd)。 genTextures现在似乎正常工作,我的名字是1。
GL_RGBA8,GL_BGRA_EXT的每种可能组合(GL_BGRA在我的系统上不起作用;我需要_EXT),我甚至从位图中删除了alpha通道并尝试了GL_RGB,GL_BGR_EXT等的所有组合等没有运气。
尝试在程序上创建位图并使用
确保未启用GL_COLOR_MATERIAL。
将位图大小更改为32x32。
尝试了glTexEnvi而不是glTexEnvf。
答案 0 :(得分:6)
除了mentat's note之外,你可能会遇到非二次幂纹理尺寸的问题,你提到纹理名称的生成没有改变名称。
听起来好像是在过早地调用glGenTextures()
,即在初始化OpenGL之前。如果你不是,那么我建议在调用glGenTextures()
之后添加代码,通过调用glGetError()
来检查OpenGL错误状态。
答案 1 :(得分:3)
在您的评论中,您说您的位图是29x20像素。为了生成有效的纹理,OpenGL要求图像大小(在每个维度上)是2的幂。它不需要是正方形,但它可以是矩形。您可以通过使用某些OpenGL扩展来解决此问题,例如GL_ARB_texture_rectangle。
答案 2 :(得分:2)
我会把它放在这里,因为我有同样的问题,并发现另一篇文章解释了这个问题。 iPhone确实支持GL_BGRA(GL_EXT_BGRA),但似乎只作为输入格式而不是内部格式。因此,如果您将glTexImage2D调用更改为具有GL_RGBA的内部格式,则它可以正常工作。
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, &sprite1[54]);
我希望这可以帮助其他人偶然发现这篇文章。
答案 3 :(得分:1)
一些随意的想法:
对于错误检查,我建议编写一个小函数,为glGetErrors中最常见的结果打印可读输出,并使用它来查找产生错误的行。另一种可能性是使用GLIntercept,BuGLe或gDEBugger之类的内容。
答案 4 :(得分:1)
我的OpenGL生锈了,但我记得glTexImage2D
遇到了同样的问题
。最后我设法使它工作,但我总是有更多的运气与gluBuild2DMipmaps
所以我最终得到了
gluBuild2DMipmaps (
GL_TEXTURE_2D, type, i.width, i.height, type, GL_UNSIGNED_BYTE, i.data
);
取代了
glTexImage2D (
GL_TEXTURE_2D, 0, type, i.width, i.height, 0, type, GL_UNSIGNED_BYTE, i.data
);
答案 5 :(得分:1)
我发现了问题。我对glEnable
的电话是glEnable(GL_BLEND | GL_TEXTURE_2D)
。使用glGetError我看到我正在为此调用获取GL_INVALID_ENUM,因此我将GL_TEXTURE_2D移动到其自己的启用函数和宾果游戏中。我猜glEnable不允许逻辑OR?
答案 6 :(得分:0)
我要检查的第一件事是颜色材质设置,如ShadowIce所述,然后检查纹理文件以确保它是合理的尺寸(例如像256x256)和RGB位图。如果文件有轻微问题,无论你如何尝试都无法正确呈现。
然后,我将不再尝试调试该代码,而是查看与tutorial on the NeHe website不同的内容。
NeHe总是一个检查你是否想在OpenGL中做事的好地方。纹理可能是最难做到的事情,而且随着其他GL技能的提高,它们会变得更加困难。