HomeGLRenderer.java 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package de.tudarmstadt.informatik.hostage.ui2.fragment;
  2. import java.nio.ByteBuffer;
  3. import java.nio.ByteOrder;
  4. import java.nio.FloatBuffer;
  5. import javax.microedition.khronos.egl.EGLConfig;
  6. import javax.microedition.khronos.opengles.GL10;
  7. import android.opengl.GLES20;
  8. import android.opengl.GLSurfaceView.Renderer;
  9. import android.opengl.Matrix;
  10. public class HomeGLRenderer implements Renderer {
  11. public static int loadShader(int type, String source) {
  12. int shader = GLES20.glCreateShader(type);
  13. GLES20.glShaderSource(shader, source);
  14. GLES20.glCompileShader(shader);
  15. return shader;
  16. }
  17. public static int loadProgram(String vertexSource, String fragmentSource) {
  18. int program = GLES20.glCreateProgram();
  19. GLES20.glAttachShader(program, loadShader(GLES20.GL_VERTEX_SHADER, vertexSource));
  20. GLES20.glAttachShader(program, loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource));
  21. GLES20.glLinkProgram(program);
  22. return program;
  23. }
  24. private int program;
  25. private FloatBuffer vertexBuffer;
  26. private float [] mvp;
  27. public HomeGLRenderer() {}
  28. public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
  29. GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  30. final float [] positions = {
  31. 0.0f, 0.5f, 0.0f, 1.0f,
  32. 0.5f, -0.5f, 0.0f, 1.0f,
  33. -0.5f, -0.5f, 0.0f, 1.0f,
  34. };
  35. ByteBuffer bb = ByteBuffer.allocateDirect(4 * positions.length);
  36. bb.order(ByteOrder.nativeOrder());
  37. vertexBuffer = bb.asFloatBuffer();
  38. vertexBuffer.put(positions);
  39. vertexBuffer.position(0);
  40. mvp = new float[16];
  41. Matrix.setIdentityM(mvp, 0);
  42. final String vertexSource =
  43. "uniform mat4 mvp;" +
  44. "attribute vec4 position;" +
  45. "void main() {" +
  46. " gl_Position = mvp * position;" +
  47. "}";
  48. final String fragmentSource =
  49. "precision mediump float;" +
  50. "uniform vec4 color;" +
  51. "void main() {" +
  52. " gl_FragColor = color;" +
  53. "}";
  54. program = loadProgram(vertexSource, fragmentSource);
  55. }
  56. public void onDrawFrame(GL10 arg0) {
  57. GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
  58. GLES20.glUseProgram(program);
  59. int positionAttribLoc = GLES20.glGetAttribLocation(program, "position");
  60. int colorUniformLoc = GLES20.glGetUniformLocation(program, "color");
  61. int mvpUniformLoc = GLES20.glGetUniformLocation(program, "mvp");
  62. float [] color = {0.0f, 1.0f, 0.0f, 1.0f};
  63. GLES20.glUniform4fv(colorUniformLoc, 1, color, 0);
  64. Matrix.rotateM(mvp, 0, 4.0f, 0.0f, 0.0f, 1.0f);
  65. GLES20.glUniformMatrix4fv(mvpUniformLoc, 1, false, mvp, 0);
  66. GLES20.glEnableVertexAttribArray(positionAttribLoc);
  67. GLES20.glVertexAttribPointer(positionAttribLoc, 4, GLES20.GL_FLOAT, false, 0, vertexBuffer);
  68. GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
  69. GLES20.glDisableVertexAttribArray(positionAttribLoc);
  70. }
  71. public void onSurfaceChanged(GL10 arg0, int width, int height) {
  72. GLES20.glViewport(0, 0, width, height);
  73. }
  74. }