【问题标题】:Simple OpenGL texture map not working?简单的 OpenGL 纹理贴图不起作用?
【发布时间】:2009-04-12 20:15:53
【问题描述】:

我正在尝试找出 OpenGL 中的纹理映射,但我找不到一个简单的示例来工作。

正在绘制多边形,虽然它没有纹理,而只是纯色。此外,位图也被正确加载到 sprite1[] 中,因为我到目前为止一直成功使用 glDrawPixels。

我使用 glGenTextures 来获取我的 tex 名称,但我注意到它并没有改变 texName1;这个 GLuint 是我初始化它的任何东西,即使在调用 glGenTextures 之后......

我已启用 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。

【问题讨论】:

  • 如果 texName1 在 glGenTextures 之后仍然为 0,你应该检查你的错误情况...
  • 在 sprite1[] 中宽度和高度是存储为字节还是整数?
  • 宽度和高度存储为字节小端。我之前使用 glDrawPixels 成功地使用了 sprite1[18] 和 sprite1[22];他们是正确的。位图只有 29x20 像素,因此可以正常工作。
  • 另外,如何检查错误情况?从参考页面中,我没有看到 glGenTextures 使用 glGetError() 生成任何对我有用的错误。

标签: c++ opengl textures


【解决方案1】:

除了mentat's note 可能对非二次方纹理尺寸有问题之外,您还提到纹理名称生成不会更改名称。

这听起来好像您调用@987654322@() 太早了,即在初始化 OpenGL 之前。如果你不是,那么我建议在调用glGenTextures() 之后添加代码,通过调用@987654323@ 来检查OpenGL 错误状态。

【讨论】:

  • 这对我有用...我试图在 OpenGL 初始化之前创建纹理。正如我一次又一次看到的那样:函数调用的顺序在 OpenGL 编程中非常重要。
【解决方案2】:

在您的 cmets 中,您说您的位图是 29x20 像素。 Afaik 要生成有效的纹理,OpenGL 要求图像大小(在每个维度上)是 2 的幂。它不需要是正方形,但它可以是矩形。您可以通过使用一些 OpenGL 扩展来克服这个问题,例如 GL_ARB_texture_rectangle

【讨论】:

【解决方案3】:

我将把它放在这里,因为我遇到了同样的问题,并找到了另一篇解释该问题的帖子。 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]);

我希望这可以帮助其他偶然发现这篇文章的人。

【讨论】:

  • 我很想听听这方面的更多信息,因为这让我很困惑。似乎将 BGRA 作为一种内部格式是可行的,但它实际上是使用 RGBA。还是我弄错了?
【解决方案4】:

一些随机的想法:

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

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

【讨论】:

    【解决方案5】:

    我的 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 
    );
    

    【讨论】:

    • 这听起来像是被遗忘的 MIN 过滤器的 glTexParameter。默认值为 GL_NEAREST_MIPMAP_LINEAR,它仅适用于 mipmapped 纹理。
    【解决方案6】:

    我发现了问题。我给glEnable 打的电话是glEnable(GL_BLEND | GL_TEXTURE_2D)。使用 glGetError 我看到我得到了这个调用的 GL_INVALID_ENUM,所以我将 GL_TEXTURE_2D 移动到它自己的启用函数和宾果游戏中。我猜glEnable不允许逻辑OR?

    【讨论】:

    • AFAIK OpenGL 常量不仅仅是 2 的幂,它们是任意值。这意味着使用逻辑 OR 会破坏信息。
    • OR-able 常量是这些名称中带有 -BIT 的常量,例如 GL_COLOR_BUFFER_BIT。在 GL 中并不多,所以不要习惯它。
    【解决方案7】:

    我要检查的第一件事是颜色材料设置,如 ShadowIce 所述,然后检查您的纹理文件以确保其大小合理(例如 256x256)和 RGB 位图。如果文件有一点小问题,无论您如何尝试,它都不会正确呈现。

    然后,我将停止尝试仅调试该代码,而是查看您与 tutorial on the NeHe website 的不同之处。

    NeHe 始终是检查您是否尝试在 OpenGL 中做事的好地方。纹理可能是最难做到的事情,而且随着你其他 GL 技能的提高,它们只会变得更加困难。

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 2019-04-19
      • 2013-04-21
      • 2017-11-26
      • 1970-01-01
      相关资源
      最近更新 更多