GLSurfaceView将每个像素设置为不同的颜色

时间:2014-10-11 17:39:37

标签: android opengl-es glsurfaceview

我是OpenGl的新手,我正在尝试编写一个简单的GLSurfaceView,它接收每个像素颜色并相应地更新视图。 我无法在任何地方找到如何做到这一点。任何人都可以提供帮助。

1 个答案:

答案 0 :(得分:0)

首先,您不需要使用特定颜色设置帧缓冲区的每个像素。它的糟糕和令人讨厌的表现。想一想。你有一个1024 x 768像素的frameBuffer,大约有786432种不同的像素颜色! 执行此操作的最佳方法是创建3个顶点的tringle,然后为每个顶点赋予颜色。 OpenGL将自动生成一个漂亮的三角形,其中包含您在这3个顶点上指定的颜色。

我们在这里添加一些代码吗?

public void triangleRender() {
    //add the background buffer color you want
    gl.glClearColor(1,0,0,1);
    //clear the buffer
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glOrthof(0, 320, 0, 480, 1, -1);

    FloatBuffer vertices;
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(3 * 2 * 4);
    byteBuffer.order(ByteOrder.nativeOrder());            
    vertices = byteBuffer.asFloatBuffer();
    vertices.put( new float[] {   0.0f,   0.0f, 1, 0, 0, 1,
                                319.0f,   0.0f, 0, 1, 0, 1,
                                160.0f, 479.0f, 0, 0, 1, 1});
    vertices.flip(); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

    vertices.position(0);
    gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
    vertices.position(2);            
    gl.glColorPointer(4, GL10.GL_FLOAT, VERTEX_SIZE, vertices);

    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
 }

请注意,每个启用dissable,projection等都是openGL STATES,这意味着每次进程暂停或停止时都必须再次调用它们。 请记住,此示例不是性能优化的,您现在不会理解。 我建议你仔细研究openGL es状态,了解图形管道。首先去2d(关于othrographic投影的提示研究),还要看一下像identity,modelView和viewPort这样的矩阵。