OpenGL ES2 Android - 将2D纹理映射到GL_TRIANGLES多维数据集

时间:2012-09-05 11:05:57

标签: android opengl-es textures uv-mapping

我正在尝试将256 * 256纹理映射到立方体上。当我这样做时,正面和背面是预期的,左右面在z方向上反转,顶面和底面是"污迹"陷入重复的模糊。我之前已经讨论过这个问题,但是我能找到的唯一解决方案是使用在OpenGL ES2.0的Androids实现中不可用的四边形,或创建一个包含所有面的顶点的顶点列表(而不仅仅是8个顶点)然后用索引0-23(而不是0-7)来引用它们。

使用它的代码给出上面的结果如下:

private float vertices[] = {

    //Front 
    -1.0f, -1.0f, 1.0f,  //0 Bottom Left
    1.0f, -1.0f, 1.0f,  //1 Bottom Right
    -1.0f, 1.0f, 1.0f,  //2 Top Left
    1.0f, 1.0f, 1.0f,  //3 Top Right

    //Back
    -1.0f, -1.0f, -1.0f, //4 Bottom Left
    1.0f, -1.0f, -1.0f, //5 Bottom Right
    -1.0f, 1.0f, -1.0f, //6 Top Left        
    1.0f, 1.0f, -1.0f //7 Top Right 
};

//Order to draw points in vertices array
private short indices[] = {
    //Faces definition
    0,1,2, 2,1,3, //Front
    5,4,7, 7,4,6, //Back
    1,5,3, 3,5,7, //Right 
    4,0,6, 6,0,2, //Left
    2,3,6, 6,3,7, //Top
    4,5,0, 0,5,1 //Bottom
};

private float textureVertices[] = {
    0.0f, 1.0f, //Front
    1.0f, 1.0f, 
    0.0f, 0.0f,
    1.0f, 0.0f,

    1.0f, 1.0f, //Back
    0.0f, 1.0f, 
    1.0f, 0.0f,
    0.0f, 0.0f,

    1.0f, 1.0f,
    0.0f, 1.0f, //Right 
    1.0f, 0.0f,
    0.0f, 0.0f,

    1.0f, 1.0f, //Left
    0.0f, 1.0f, 
    1.0f, 0.0f,
    0.0f, 0.0f,

    0.0f, 1.0f, //Top
    1.0f, 1.0f, 
    0.0f, 0.0f,
    1.0f, 0.0f,

    0.0f, 1.0f, //Bottom
    1.0f, 1.0f, 
    0.0f, 0.0f,
    1.0f, 0.0f

};

public void draw(GL10 gl){
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureIDs[0]);

    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glFrontFace(GL10.GL_CCW);
    gl.glCullFace(GL10.GL_BACK);

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,GL10.GL_UNSIGNED_SHORT,indicesBuffer);

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glDisable(GL10.GL_CULL_FACE);
}

我认为帖子Mapping a square texture to a triangle中接受的答案几乎涵盖了后来的内容,如果确实可以按照我预期的方式对索引和纹理进行索引。

1 个答案:

答案 0 :(得分:1)

您的vertices数组应与textureVertices数组的布局匹配。这意味着8个顶点不需要渲染纹理立方体,在相同位置的顶点可能具有不同的纹理坐标,具体取决于它们属于哪个面,因为indices是纹理和顶点数组的索引。 / p>

考虑旋转的立方体,使边缘面向你。在边缘的左侧,纹理结束。在右侧,纹理开始。