android - 为什么我们不能画一个像三角形那样的正方形呢?

标签 android opengl-es

我在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,1,2,3}作为索引缓冲区的内容。您必须指定 GL_TRIANGLE_FAN 作为 glDrawElements() 的第一个参数,而不是使用 GL_TRIANGLES 作为基元类型。

或者,如果您交换最后两个索引使其成为 {0,1,3,2},则可以使用更常用的 GL_TRIANGLE_STRIP 原语来绘制它们类型。

GL_TRIANGLE_STRIPGL_TRIANGLE_FAN 都用于绘制相连三角形的集合。

事实上,如果您的索引仅形成一个简单的序列,则根本不需要它们。您可以简单地摆脱整个 drawOrder 内容,并使用 glDrawArrays() 而不是 glDrawElements() 绘制正方形:

glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

关于android - 为什么我们不能画一个像三角形那样的正方形呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29018781/

相关文章:

Android:访问硬件相机预览帧数据而不绘制它们

objective-c - GLubyte/GLushort 使用问题

android - AbstractStringBuilder enlargeBuffer 中的 OutOfMemoryError

android - 无法在我的 Android 应用程序的 TextView 中看到默认的 Android 表情符号

Android 模拟器 vs 手机 opengl 不一致

android - 在 Android 中集成 jPCT-AE 和 ARToolKit

android - 使用矩阵作为顶点着色器属性时崩溃

c++ - OpenGL 分离 RGB channel

java - AsyncTask,在 onPostExecute 与 get() 中处理结果

android - 单击按钮时在 map 上平移坐标 (Android)