我有一个由obj文件(波前)加载的网格,其中包含每个面的法线和纹理坐标以及可用的相对纹理。在我的C ++ / OpenGL代码(计算机图形类的分配)中,我正确地绑定了纹理,但是无法正确地将纹理坐标与面顶点映射。下面,我显示了纹理绑定的代码以及栅格化对象的调用链。我还显示了预期结果和实际结果的图像(其中2个,每个渲染设置一个)。具体来说,似乎第一个渲染在整个对象的光栅化形状上“镶嵌”了普通图像,而第二个渲染一次在对象的形状上映射了图像。

发生了什么





绑定过程:

SDL_Surface *s = IMG_Load(filename.c_str());

glBindTexture(GL_TEXTURE_2D, textureIndex);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB,
        s->w, s->h, GL_RGB, GL_UNSIGNED_BYTE, s->pixels);
glTexParameteri(GL_TEXTURE_2D,
        GL_TEXTURE_MAG_FILTER,
        GL_LINEAR );
glTexParameteri(GL_TEXTURE_2D,
        GL_TEXTURE_MIN_FILTER,
        GL_LINEAR_MIPMAP_LINEAR );


光栅过程(拟使用伪代码):

// gl pushMatrix, Traslation and rotations;
glPushMatrix();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textureIndex);
glColor3f(1,1,1);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glDisable(GL_LIGHTING);
glBegin(GL_TRIANGLES);
for (face f in faces) {
  glNormal3d(faceNormal.x, faceNormal.y, faceNormal.z);
  for (i = 0, i < 3, ++i) {
    glTexCoord3d(texturePoint[i].x, texturePoint[i].y, 0);
    glVertex3d(vertex[i].x, vertex[i].y, vertex[i].z);
  }
}
glEnd();
glPopMatrix();
// gl PopMatrix to exit from traslation / rotation context.


评论

您的GL_TEXTURE_MATRIX设置为什么?也许它具有一定的扩展性? (此外,此代码的矩阵模式是什么?您推送当前矩阵,但在执行此操作之前似乎没有设置模式。)

在绑定代码之前:glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(70,3.0 / 4,0.2,1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity();没有排序的缩放比例(实际上有缩放比例,但是当您提到它时,我将其删除,并且并没有太大改变结果)。

#1 楼

我看到您使用glEnable(GL_TEXTURE_GEN_S);但也可以使用glTexCoord(...)来加载坐标。这些是IIRC的互斥功能。如果要提供自己的纹理坐标,则无需使用glEnable(GL_TEXTURE_GEN_n)。

评论


$ \ begingroup $
你说得对!我只是试图删除这些行,第一个示例现在的行为类似于第二个示例。至此,我认为第二个示例仅存在“旋转纹理”问题,我将尝试让您知道。
$ \ endgroup $
–phagio
16年7月7日在11:33

$ \ begingroup $
是的,我确认,这可以解决问题。非常感谢!
$ \ endgroup $
–phagio
16年7月7日在12:20

#2 楼

for (i = 0, i < 3, ++i)
    glTexCoord3d(texturePoint[i].x, texturePoint[i].y, 0);
    glVertex3d(v[i]->x(), v[i]->y(), v[i]->z());


此代码调用glTexCoord3d三次,仅调用glVertex3d一次。您需要在for循环周围放置更多的花括号。

评论


$ \ begingroup $
嗨,谢谢你:)对不起,这是一个错字:周期是正确的(否则我将超出范围)。我要添加必要的括号。
$ \ endgroup $
–phagio
16年6月17日在13:29

#3 楼

您的几何体可能已为Direct3D做好了准备,其纹理空间原点的放置方式有所不同(左上角与左下角)。尝试翻转纹理的Y坐标(即,从底部到顶部加载)或V纹理的坐标(glTexCoord3d(texturePoint[i].x, 1.0f - texturePoint[i].y, 0);)。

评论


$ \ begingroup $
试过了,没有用。我认为Direct3D几何不是这种情况,因为我在Ubuntu上-Direct3D不是Microsoft专有的吗?
$ \ endgroup $
–phagio
16年6月20日在19:38

$ \ begingroup $
更新:它实际上与此有关,尽管这是一个小错误。
$ \ endgroup $
–phagio
16年7月21日在7:28