OpenGL:纹理加载但未应用
Posted
技术标签:
【中文标题】OpenGL:纹理加载但未应用【英文标题】:OpenGL: Texture loading but not applied 【发布时间】:2014-03-06 18:57:30 【问题描述】:更新
我已经停止使用glutSolidCube
并开始手动应用纹理。仍然无济于事。有什么想法,如果没有,你能指出一个纹理成功应用于立方体的例子吗?
glRotatef(180, 0.0f, 1.0f, 0.0f);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
glTranslatef(pos_x, 0, pos_z);
int size = 1;
// Begin Rending
glBegin(GL_QUADS);
// Face 1
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f( size, size,-size);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-size, size,-size);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-size, size, size);
glTexCoord2f(0.0f, 1.0f);
glVertex3f( size, size, size);
// Face 2
glNormal3f( 0.0f, 0.0f,-1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f( size,-size, size);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-size,-size, size);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-size,-size,-size);
glTexCoord2f(0.0f, 1.0f);
glVertex3f( size,-size,-size);
// Face 3
glTexCoord2f(0.0f, 0.0f);
glVertex3f( size, size, size);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-size, size, size);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-size,-size, size);
glTexCoord2f(0.0f, 1.0f);
glVertex3f( size,-size, size);
// Face 4
glNormal3f( 0.0f,-1.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f( size,-size,-size);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-size,-size,-size);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-size, size,-size);
glTexCoord2f(0.0f, 1.0f);
glVertex3f( size, size,-size);
// Face 5
glNormal3f( 1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-size, size, size);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-size, size,-size);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-size,-size,-size);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-size,-size, size);
// Face 6
glNormal3f( 1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f( size, size,-size);
glTexCoord2f(1.0f, 0.0f);
glVertex3f( size, size, size);
glTexCoord2f(1.0f, 1.0f);
glVertex3f( size,-size, size);
glTexCoord2f(0.0f, 1.0f);
glVertex3f( size,-size,-size);
glEnd();
我正在使用 OpenGL + Glut 制作一个基于体素的简单游戏,但在加载纹理并将其应用于立方体时遇到了问题。纹理在此处创建:
texture = SOIL_load_OGL_cubemap (
"block.png",
"block.png",
"block.png",
"block.png",
"block.png",
"block.png",
SOIL_LOAD_RGB,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_MIPMAPS
);
并在此处应用到draw方法中:
glEnable(GL_TEXTURE_GEN_S); //enable texture coordinate generation
glEnable(GL_TEXTURE_GEN_T);
glBindTexture(GL_TEXTURE_2D, texture);
glutSolidCube(2);
glDisable(GL_TEXTURE_GEN_S); //enable texture coordinate generation
glDisable(GL_TEXTURE_GEN_T);
但是当我运行应用程序时,我仍然得到一个纯白色的立方体。
(来源:snag.gy)
我是否遗漏了一些非常明显的东西?
【问题讨论】:
你glEnable(GL_TEXTURE_CUBE_MAP)
了吗?为什么在glBindTexture()
中使用GL_TEXTURE_2D
目标而不是GL_TEXTURE_CUBE_MAP
?
用新旧解决方案都试过了,没有运气。
您是否启用了 2D 纹理? (glEnable(GL_TEXTURE_2D))。另外,我不熟悉 SOIL,但您可能应该只使用 2D 纹理,而不是立方体贴图。因此,您对 SOIL_load_OGL_cubemap 的调用可能不正确。环顾四周,看看是否有可以加载常规 2D 纹理的 SOIL 函数。
@genpfault,为什么需要立方体贴图纹理?我的理解是立方体贴图用于反射和类似的东西。
@redsoxfantom:不知道,OP 使用的是SOIL_load_OGL_cubemap()
,所以我认为他们正在尝试进行立方体贴图。
【参考方案1】:
glutSolidCube 不包含 uv 坐标,因此 OpenGL 无法知道应该在哪里应用纹理。我相信只有 glutSolidTeapot 可以这样纹理?不过不确定。
无论如何,除了自动生成 uv 坐标之外,没有任何方法可以轻松地对 glutSolidCube 进行纹理处理。我不知道该怎么做,但这link 可能会有所帮助。如果您不想处理自动生成坐标,则只需手动绘制立方体并在此处指定 uvs。
【讨论】:
更新了问题。以上是关于OpenGL:纹理加载但未应用的主要内容,如果未能解决你的问题,请参考以下文章