1

我创建了一个立方体,然后更改了它的坐标以使其成为这样的光束(点击我)

我确信纹理加载正常,因为我已成功加载项目中的其他纹理(使用 SOIL)。

梁的代码是这样的:

glBindTexture(GL_TEXTURE_2D, obstacle_texture);
glBegin(GL_QUAD_STRIP);
    // front
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, 0.0f);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, 0.0f, 0.0f);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, height, 0.0f);
    glTexCoord2f(0.0f, 1.0f );  glVertex3f(0.0f, height, 0.0f);
    // back
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, -side);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(side, 0.0f, -side);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, height, -side);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(0.0f, height, -side);
    // right
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(side, 0.0f, 0.0f);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(side, 0.0f, -side);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, height, -side);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, height, 0.0f);
    // left
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, 0.0f);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(0.0f, 0.0f, -side);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(0.0f, height, -side);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(0.0f, height, 0.0f);
    // top
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, height, 0.0f);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, height, 0.0f);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, height, -side);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(0.0f, height, -side);
    // bottom
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, 0.0f);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(side, 0.0f, 0.0f);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, 0.0f, -side);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(0.0f, 0.0f, -side);
glEnd(); 

结果是这样的:

beam_wrongTextureMapping

纹理映射应该有问题,或者
我应该让立方体保持原样并将纹理应用到它,然后对其进行缩放(但我认为这会使纹理看起来失真)。

我该怎么办?

更新#1: 在 SOIL 之前,我一直在使用加载器来加载我在网站上找到的 BMP 文件。我现在使用它,它看起来像这样:

在此处输入图像描述

请注意,在我指出的地方,立方体似乎有一些三角形整体。我正在使用这样的土壤:

GLuint tex_2d = SOIL_load_OGL_texture
        (
        imagepath,
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
        SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
        );
    glBindTexture(GL_TEXTURE_2D, tex_2d);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
4

1 回答 1

4

所以,这里至少有三个问题。

您正在渲染一个四边形,但提供坐标就像您正在渲染单独的四边形一样。所以你会得到额外的基元被渲染。这不是您的问题的根源,但是您在某处吐出了错误的几何形状。

一些 UV 坐标似乎偏离了 - 在某些面上,坐标在脸部周围进行,而在另一些面上,坐标呈锯齿形。

这是你的前两张脸:

glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, 0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, height, 0.0f);
glTexCoord2f(0.0f, 1.0f );  glVertex3f(0.0f, height, 0.0f);

glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, -side);
glTexCoord2f(0.0f, 1.0f);   glVertex3f(side, 0.0f, -side);
glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, height, -side);
glTexCoord2f(1.0f, 1.0f);   glVertex3f(0.0f, height, -side);

在第二个面上,中间的两个 UV 坐标是对角线的,但在第一个面上不是这样。只有其中一个是正确的,所以在不正确的面上,你会得到不好的纹理。

您的纹理加载问题可能是填充问题,加载的纹理具有与 GL 所期望的不同的填充要求(默认情况下,GL 期望将纹理数据行填充为 4 个字节)。要么告诉 GL 你的纹理是如何填充的,要么改变纹理使其匹配(这就是为什么你的 BMP 纹理效果更好 - BMP 的填充要求恰好与 GL 一起使用)。

可能的解决方法是:

  • 告诉 GL 你的纹理是如何打包的,使用(例如)glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  • 更改纹理的尺寸,以便填充匹配而不更改任何内容
  • 更改纹理的加载,使填充与 GL 期望的一致

我怀疑这里可能还有一些问题,因为 BMP 和 PNG 纹理上出现了一条奇怪的黄色条纹,但我会先解决明显的问题。

最后,标准建议 - 避免使用单个顶点提交的旧式固定功能管道,并使用 VBO 和绘图调用。

于 2013-02-19T11:19:23.613 回答