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

问题

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

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

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

我已启用 GL_TEXTURE_2D。

继承人的代码:

<span style="color:#003b61"><span style="background-color:#ffffff"><code class="language-cpp">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();
</code></span></span>

更新:我不知所措。这是我尝试过的所有内容:

  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. 将位图大小更改为 32×32。

  6. 尝试了 glTexEnvi 而不是 glTexEnvf。

解决方法

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

然后,我将停止尝试仅调试该代码,而是查看您与 NeHe 网站上的教程有什么不同。

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

我的 OpenGL 生锈了,但我记得与glTexImage2D
. 最后我设法让它工作,但我总是有更多的运气, gluBuild2DMipmaps
所以我最终得到了

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-cpp">gluBuild2DMipmaps (
  GL_TEXTURE_2D, type, i.width, i.height, type, GL_UNSIGNED_BYTE, i.data
);
</code></span></span>

取代

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-cpp">glTexImage2D (
  GL_TEXTURE_2D, 0, type, i.width, i.height, 0, type, GL_UNSIGNED_BYTE, i.data 
);</code></span></span>

 

一些随机的想法:

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

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

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

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

 文章来源:简单的 OpenGL 纹理贴图不起作用?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值