OpenGL ES2 Android-将2D纹理映射到GL_TRIANGLES立方体



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

给出上述结果的代码im如下所示:

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

我认为,如果真的可以按照预期的方式索引和纹理,那么在将正方形纹理映射到三角形的帖子中,公认的答案几乎涵盖了我想要的内容。

您的vertices阵列应与textureVertices阵列的布局相匹配。这意味着8个顶点不足以渲染纹理立方体,因为同一位置的顶点可能具有不同的纹理坐标,这取决于它们所属的面,因为indices是纹理和顶点阵列的索引。

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

最新更新