【发布时间】: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();
更新: 我不知所措。这是我尝试过的所有内容:
原来我是在初始化 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。
【问题讨论】:
-
如果 texName1 在 glGenTextures 之后仍然为 0,你应该检查你的错误情况...
-
在 sprite1[] 中宽度和高度是存储为字节还是整数?
-
宽度和高度存储为字节小端。我之前使用 glDrawPixels 成功地使用了 sprite1[18] 和 sprite1[22];他们是正确的。位图只有 29x20 像素,因此可以正常工作。
-
另外,如何检查错误情况?从参考页面中,我没有看到 glGenTextures 使用 glGetError() 生成任何对我有用的错误。