我创建了一个立方体,然后更改了它的坐标,使其成为像(click me)这样的光束。
我确信纹理正在加载,因为我在项目中成功加载了其他纹理(使用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();
结果如下:
纹理映射应该有问题 OR
我应该保留原样并将纹理应用到它,然后缩放它(但我认为这会使纹理看起来扭曲)。
我该怎么办?
更新#1: 在SOIL之前,我曾经在一个网站上找到了BMP文件的加载程序。 我现在用过它,它看起来像这样:
请注意,好像立方体有一些三角形的整体,我指出了它。 我正在使用这样的SOIL:
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 );
答案 0 :(得分:4)
所以,这里至少有三个问题。
您正在渲染四条带,但是给出坐标就像渲染单独的四边形一样。因此,您将获得额外的基元渲染。这不是你的问题的根源,但是你在某处吐出了糟糕的几何形状。
一些紫外线坐标似乎不合适 - 在某些面上,坐标围绕着脸部,而在其他面上,坐标为锯齿形。
这是你的前两张脸:
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一起工作)。
可能的解决方法是:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
我怀疑这里可能还有一些问题,因为你在两个 BMP和PNG纹理上都出现了一个奇怪的黄色条纹,但我先解决了明显的问题。
最后,标准建议 - 避免使用单个顶点提交的旧式固定功能管道,并使用VBO和绘制调用。