使用顶点数组时,OpenGL纹理坐标会倾斜

时间:2014-10-19 18:06:56

标签: opengl texture-mapping vertex-array

我有以下代码尝试使用顶点数组绘制矩形:

glEnableClientState( GL_NORMAL_ARRAY );
glNormalPointer( GL_FLOAT, 0, &mNorms[ 0 ] );
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glTexCoordPointer( 2, GL_FLOAT, 0, &mTexCrds[ 0 ] );
glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer( 3, GL_FLOAT, 0, &mVtxs[ 0 ] );
glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 );

目的是使用角落图案“远左”,“近左”,“右”,“近右”通过三角形条绘制一个简单的矩形。变量值如下:

         /* far left              near left            far right             near right */
mNorms   { 0.0, 1.0, 0.0,         0.0, 1.0, 0.0,       0.0, 1.0, 0.0,        0.0, 1.0, 0.0 }
mTexCrds { 0.0, 1.0,              0.0, 0.0,            1.0, 1.0,             1.0, 0.0 }
mVtxs    { -25.0, 0.0, -100.0,    -25.0, 0.0, -50.0,   25.0, 0.0, -100.0,    25.0, 0.0, -50.0 }

我的纹理是一块黑色瓷砖,所有边缘都有一个细蓝色边框。使用上述说明绘制矩形时,它是完全蓝色的:

bad.jpg http://www.graemecentralstation.com/img/bad.jpg

显然,考虑到上面的纹理坐标,我期待我的2D纹理完全可见。

如果我使用相同的数组数据替换glDrawArrays()并使用相同的数组数据...

glBegin( GL_TRIANGLE_STRIP );
{
    for( int i = 0; i < 4; ++i )
    {
        glNormal3fv( &mNorms[ i * 3 ] );
        glTexCoord2fv( &mTexCrds[ i * 2 ] );
        glVertex3fv( &mVtxs[ i * 3 ] );
    }
}
glEnd();

...然后绘制矩形,使我看到完整的纹理贴图图像:

good.jpg http://www.graemecentralstation.com/img/good.jpg

任何想法为什么glDrawArrays()会严重扭曲我的纹理?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用纹理坐标作为片段着色器中的颜色进行调试,这样就可以看出纹理坐标是否正确。gl_FragColor = vec4( vec2( texCoord),0,1);

答案 1 :(得分:-1)

您可能需要添加
glActiveTextureARB(GL_TEXTURE0_ARB); glBindTexture(GL_TEXTURE_2D,texID);

glEnableClientState( GL_TEXTURE_COORD_ARRAY );

之前