0

我正在 Android 上学习 OpenGLES20 并且有一些问题。希望你们能帮帮我。

  1. 根据 Android Developers 网站“...OpenGL ES 允许您使用三维空间中的坐标定义绘制的对象。” . 仅此而已,这是严格正确的,还是它们“隐藏”了“ w”坐标?正常空间有 3 个坐标,但剪辑空间有 4 (x,y,z,w),对吧?

  2. GLES20.glBindBuffer(arg0, arg1)如果我的三角形是在浮点数组中定义的,为什么只为 int 值定义函数?

  3. 即使我没有输入glBindBuffer(GL_ARRAY_BUFFER, myPositionBufferObject);我的程序正在运行的代码。如果我没有将我的缓冲区绑定到 OpenGL 目标 GL_ARRAY_BUFFER,这怎么会起作用?

这是我的三角形的代码。这是只需要渲染最简单的三角形的超级简化代码。

public class Triangle {

    ByteBuffer myByteBuffer;
    FloatBuffer positionBufferObject;    

    int mProgram;

    public Triangle() {

        float vertexPositions[] = { 

                 0.75f,  0.75f, 0.0f, 1.0f,
                 0.75f, -0.75f, 0.0f, 1.0f,
                -0.75f, -0.75f, 0.0f, 1.0f

        };

        myByteBuffer = ByteBuffer.allocateDirect(vertexPositions.length * 4);
        myByteBuffer.order(ByteOrder.nativeOrder());

        positionBufferObject = myByteBuffer.asFloatBuffer();
        positionBufferObject.put(vertexPositions);
        positionBufferObject.position(0);

        String vertexShaderCode =
                "attribute vec4 vPosition;" +
                "void main() {" +
                "  gl_Position = vPosition;" +
                "}";

        String fragmentShaderCode =
                "precision mediump float;" +
                "uniform vec4 vColor;" +
                "void main() {" +
                "  gl_FragColor = vColor;" +
                "}";

        int myVertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
        GLES20.glShaderSource(myVertexShader, vertexShaderCode);
        GLES20.glCompileShader(myVertexShader);

        int myFragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
        GLES20.glShaderSource(myFragmentShader, fragmentShaderCode);
        GLES20.glCompileShader(myFragmentShader);

        mProgram = GLES20.glCreateProgram();

        GLES20.glAttachShader(mProgram, myVertexShader);        
        GLES20.glAttachShader(mProgram, myFragmentShader); 

        GLES20.glLinkProgram(mProgram);        

    }

    public void draw() {

        GLES20.glUseProgram(mProgram);

        GLES20.glEnableVertexAttribArray(0);
        GLES20.glVertexAttribPointer(0, 4, GLES20.GL_FLOAT, false, 0, positionBufferObject);

        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);

    }

}
4

0 回答 0