diff --git a/src/com/homelinux/holtrop/opengltest/MyRenderer.java b/src/com/homelinux/holtrop/opengltest/MyRenderer.java index 8301fb1..aa72d4a 100644 --- a/src/com/homelinux/holtrop/opengltest/MyRenderer.java +++ b/src/com/homelinux/holtrop/opengltest/MyRenderer.java @@ -4,17 +4,85 @@ import android.opengl.GLSurfaceView; import android.opengl.GLES20; import javax.microedition.khronos.opengles.GL10; import javax.microedition.khronos.egl.EGLConfig; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.ByteOrder; public class MyRenderer implements GLSurfaceView.Renderer { + private int m_quad_attrib_buffer; + private int m_program; + + private int load_shader(int type, String source) + { + int shader = GLES20.glCreateShader(type); + + GLES20.glShaderSource(shader, source); + GLES20.glCompileShader(shader); + + return shader; + } + public void onSurfaceCreated(GL10 unused, EGLConfig config) { + final float attribs[] = { + 1, 1, 0, 1, 1, 1, + -1, 1, 0, 1, 0, 0, + -1, -1, 0, 0, 1, 0, + 1, -1, 0, 0, 0, 1 + }; + ByteBuffer bb = ByteBuffer.allocateDirect(attribs.length * 4); + bb.order(ByteOrder.nativeOrder()); + FloatBuffer fb = bb.asFloatBuffer(); + fb.put(attribs); + fb.position(0); + int[] buffers = {0}; + GLES20.glGenBuffers(1, buffers, 0); + m_quad_attrib_buffer = buffers[0]; + GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, m_quad_attrib_buffer); + GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, 0, fb, + GLES20.GL_STATIC_DRAW); + + final String v_shader_src = + "attribute vec3 pos;" + + "attribute vec3 color;" + + "varying vec3 color_i;" + + "void main() {" + + " gl_Position = vec4(pos / 2.0, 1);" + + " color_i = color;" + + "}"; + final String f_shader_src = + "varying vec3 color_i;" + + "void main() {" + + " gl_FragColor = vec4(color_i, 1);" + + "}"; + int v_shader = load_shader(GLES20.GL_VERTEX_SHADER, v_shader_src); + int f_shader = load_shader(GLES20.GL_FRAGMENT_SHADER, f_shader_src); + m_program = GLES20.glCreateProgram(); + GLES20.glAttachShader(m_program, v_shader); + GLES20.glAttachShader(m_program, f_shader); + GLES20.glLinkProgram(m_program); + GLES20.glClearColor(1.0f, 0.6f, 0.1f, 1.0f); } public void onDrawFrame(GL10 unused) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); + + GLES20.glUseProgram(m_program); + GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, m_quad_attrib_buffer); + int attr_pos = GLES20.glGetAttribLocation(m_program, "pos"); + int attr_color = GLES20.glGetAttribLocation(m_program, "color"); + GLES20.glEnableVertexAttribArray(attr_pos); + GLES20.glEnableVertexAttribArray(attr_color); + GLES20.glVertexAttribPointer(attr_pos, 3, GLES20.GL_FLOAT, false, + 6 * 4, 0); + GLES20.glVertexAttribPointer(attr_color, 3, GLES20.GL_FLOAT, false, + 6 * 4, 3 * 4); + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 4); + GLES20.glDisableVertexAttribArray(attr_pos); + GLES20.glDisableVertexAttribArray(attr_color); } public void onSurfaceChanged(GL10 unused, int width, int height)