【问题标题】:OpenGL texture coordinates being skewed when using vertex arrays使用顶点数组时 OpenGL 纹理坐标发生倾斜
【发布时间】:2014-10-19 18:06:56
【问题描述】:

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

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 );

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

/* 远左近左 远右近右 */ 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() 会严重扭曲我的纹理吗?

【问题讨论】:

  • IMO 如果您正在经历设置glVertexPointer 等的所有麻烦,您也可以只使用顶点缓冲区对象。它可能会表现得更好。

标签: opengl texture-mapping vertex-array


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    就在glEnableClientState( GL_TEXTURE_COORD_ARRAY );之前

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 2019-12-15
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      相关资源
      最近更新 更多