简单的OpenGL纹理贴图不起作用?

时间:2009-04-12 20:15:53

标签: c++ opengl textures

我正在尝试在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();

更新: 我不知所措。这是我尝试过的一切:

  1. 原来我在初始化OGL之前初始化我的纹理。纹理在类构造函数中初始化(glGenTextures-> glTexImage2D),并在每个帧调用的成员函数中绘制(glBegin-> glEnd)。 genTextures现在似乎正常工作,我的名字是1。

  2. GL_RGBA8,GL_BGRA_EXT的每种可能组合(GL_BGRA在我的系统上不起作用;我需要_EXT),我甚至从位图中删除了alpha通道并尝试了GL_RGB,GL_BGR_EXT等的所有组合等没有运气。

  3. 尝试在程序上创建位图并使用

  4. 确保未启用GL_COLOR_MATERIAL。

  5. 将位图大小更改为32x32。

  6. 尝试了glTexEnvi而不是glTexEnvf。

7 个答案:

答案 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)

一些随意的想法:

  • 可能启用了GL_COLOR_MATERIAL
  • 将“glTexEnvf”更改为“glTexEnvi”并查看是否有帮助
  • 如果在glGenTextures之后texName1为0,则可能没有活动的OpenGL上下文

对于错误检查,我建议编写一个小函数,为glGetErrors中最常见的结果打印可读输出,并使用它来查找产生错误的行。另一种可能性是使用GLInterceptBuGLegDEBugger之类的内容。

答案 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技能的提高,它们会变得更加困难。