我在android文档中找到了代码。
public class Square {
private FloatBuffer vertexBuffer;
private ShortBuffer drawListBuffer;
// number of coordinates per vertex in this array
static final int COORDS_PER_VERTEX = 3;
static float squareCoords[] = {
-0.5f, 0.5f, 0.0f, // top left
-0.5f, -0.5f, 0.0f, // bottom left
0.5f, -0.5f, 0.0f, // bottom right
0.5f, 0.5f, 0.0f }; // top right
private short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; // order to draw vertices
public Square() {
// initialize vertex byte buffer for shape coordinates
ByteBuffer bb = ByteBuffer.allocateDirect(
// (# of coordinate values * 4 bytes per float)
squareCoords.length * 4);
bb.order(ByteOrder.nativeOrder());
vertexBuffer = bb.asFloatBuffer();
vertexBuffer.put(squareCoords);
vertexBuffer.position(0);
// initialize byte buffer for the draw list
ByteBuffer dlb = ByteBuffer.allocateDirect(
// (# of coordinate values * 2 bytes per short)
drawOrder.length * 2);
dlb.order(ByteOrder.nativeOrder());
drawListBuffer = dlb.asShortBuffer();
drawListBuffer.put(drawOrder);
drawListBuffer.position(0);
}
}
为什么我们不能简单地编写以下代码来完成任务?
private short drawOrder[] = {0,1,2,3};
这是仅出于性能原因编写的,还是唯一的方法?
答案 0 :(得分:2)
您可以使用{0,1,2,3}
作为索引缓冲区的内容。您不必使用GL_TRIANGLES
作为基元类型,而是必须将GL_TRIANGLE_FAN
指定为glDrawElements()
的第一个参数。
或者,如果您将最后两个索引交换为{0,1,3,2}
,则可以使用更常用的GL_TRIANGLE_STRIP
基元类型绘制它们。
GL_TRIANGLE_STRIP
和GL_TRIANGLE_FAN
都用于绘制连接三角形的集合。
事实上,如果您的索引只是一个简单的序列,那么根本不需要它们。您可以简单地删除整个drawOrder
内容,并使用glDrawArrays()
代替glDrawElements()
绘制正方形:
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
答案 1 :(得分:1)
OpenGL ES不支持四边形作为本机原始类型;只有点,线和三角形。