我正在尝试将 256*256 纹理映射到立方体上。当我这样做时,正面和背面如预期的那样,左右面在 z 方向上反转,顶面和底面被“弄脏”成重复的模糊。这个问题我之前已经介绍过,但是我能找到的唯一解决方案是使用四边形,这在 OpenGL ES2.0 的 Android 实现中不可用,或者创建一个包含所有面的顶点的顶点列表(而不仅仅是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);
}
我认为将方形纹理映射到三角形的帖子中接受的答案几乎涵盖了我之后的内容,如果确实有可能以我期望的方式进行索引和纹理。