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:纹理加载但未应用的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL纹理随机未显示

在OpenGL中动态加载纹理的好方法是啥?

高效的 OpenGL 纹理加载 gxbase

OpenGL - 纹理加载不正确

如何从 OpenGL 中的帧缓冲区纹理中采样像素?

使用 SDL 加载 OpenGL 纹理