Android OpenGL ES 2.0:球体纹理映射

时间:2015-12-09 07:51:33

标签: android opengl-es

我创建了2个球体,我正在尝试纹理它们。然而,纹理坐标似乎有点偏。

纹理(应该是一个窗口或某种休息):
regex101 demo

将纹理应用于两个球体的结果(您可以忽略不在正方形周围的黑线,这只是相机 - 是的它是AR应用程序):

Texture

现在我使用perl脚本导出了Sphere,我发现它将obj文件转换为顶点列表和纹理坐标SpaceShip。并且obj文件已经转换为2160个顶点。

当我渲染球体时:

    GLES20.glVertexAttribPointer(vertexHandle, 3, GLES20.GL_FLOAT,
            false, 0, ufo_sphere.getVertices());
    GLES20.glVertexAttribPointer(normalHandle, 3, GLES20.GL_FLOAT,
            false, 0, ufo_sphere.getNormals());
    GLES20.glVertexAttribPointer(textureCoordHandle, 3,
            GLES20.GL_FLOAT, false, 0, ufo_sphere.getTexCoords());

    GLES20.glEnableVertexAttribArray(vertexHandle);
    GLES20.glEnableVertexAttribArray(normalHandle);
    GLES20.glEnableVertexAttribArray(textureCoordHandle);

    // activate texture 0, bind it, and pass to shader
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,
            mTextures.get(textureIndex).mTextureID[0]);
    GLES20.glUniform1i(texSampler2DHandle, 0);

    // pass the model view matrix to the shader
    GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false,
            modelViewProjection, 0);


    //GLES20.glDrawElements(GLES20.GL_TRIANGLES, sphere.getNumObjectVertex(), GLES20.GL_UNSIGNED_SHORT, 0);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, sphere.getNumObjectVertex()); // I have tried TRIANGLES and TRIANGLE_FAN as well

    // disable the enabled arrays
    GLES20.glDisableVertexAttribArray(vertexHandle);
    GLES20.glDisableVertexAttribArray(normalHandle);
    GLES20.glDisableVertexAttribArray(textureCoordHandle);

1 个答案:

答案 0 :(得分:1)

我至少可以看到一件似乎错误的事情......

GLES20.glVertexAttribPointer(textureCoordHandle, 3,
        GLES20.GL_FLOAT, false, 0, ufo_sphere.getTexCoords());

纹理坐标的大小通常为2(u,v)。所以你可以试试这个:

GLES20.glVertexAttribPointer(textureCoordHandle, 2,
        GLES20.GL_FLOAT, false, 0, ufo_sphere.getTexCoords());

此外,在您提供的链接中,他们使用GL_TRIANGLES格式而不是GL_TRIANGLE_STRIP,因此您应切换回该格式。