openGL es2.0 创建颜色平面和文理平面

浅浅的花香味﹌ 2022-08-06 11:08 234阅读 0赞

一、创建颜色平面的Java代码和Shader Language:

  1. package com.gzdxid.utils;
  2. import java.nio.ByteBuffer;
  3. import java.nio.ByteOrder;
  4. import java.nio.FloatBuffer;
  5. import android.opengl.GLES20;
  6. public class DrawRectColor {
  7. int mProgram;
  8. int muMVPMatrixHandle;
  9. int maPositionHandle;
  10. int muColorRHandle;
  11. int muColorGHandle;
  12. int muColorBHandle;
  13. int muColorAHandle;
  14. FloatBuffer mVertexBuffer;
  15. int vCount = 0;
  16. float r,g,b,a;
  17. public DrawRectColor(float width,float height,int mProgam) {
  18. initVertexData(width,height);
  19. intShader(mProgam);
  20. }
  21. private void initVertexData(float width,float height) {
  22. // TODO Auto-generated method stub
  23. vCount = 6;
  24. float w = width / 2;
  25. float h = height / 2;
  26. float vertices[] = new float[] {
  27. -w, h, 0,
  28. -w, -h, 0,
  29. w, -h, 0,
  30. w, -h, 0,
  31. w, h, 0,
  32. -w, h, 0,
  33. };
  34. ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
  35. vbb.order(ByteOrder.nativeOrder());
  36. mVertexBuffer = vbb.asFloatBuffer();
  37. mVertexBuffer.put(vertices);
  38. mVertexBuffer.position(0);
  39. }
  40. private void intShader(int mProgram) {
  41. // TODO Auto-generated method stub
  42. this.mProgram=mProgram;
  43. muMVPMatrixHandle=GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
  44. maPositionHandle=GLES20.glGetAttribLocation(mProgram, "aPosition");
  45. muColorRHandle=GLES20.glGetUniformLocation(mProgram, "uColorR");
  46. muColorGHandle=GLES20.glGetUniformLocation(mProgram, "uColorG");
  47. muColorBHandle=GLES20.glGetUniformLocation(mProgram, "uColorB");
  48. muColorAHandle=GLES20.glGetUniformLocation(mProgram, "uColorA");
  49. }
  50. public void drawSelf(float r,float g,float b,float a){
  51. GLES20.glUseProgram(mProgram);
  52. GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);
  53. GLES20.glUniform1f(muColorRHandle, r);
  54. GLES20.glUniform1f(muColorGHandle, g);
  55. GLES20.glUniform1f(muColorBHandle, b);
  56. GLES20.glUniform1f(muColorAHandle, a);
  57. GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 3*4, mVertexBuffer);
  58. GLES20.glEnableVertexAttribArray(maPositionHandle);
  59. GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vCount);
  60. }
  61. }

定点着色器代码:

  1. uniform mat4 uMVPMatrix;
  2. attribute vec3 aPosition;
  3. void main(){
  4. gl_Position=uMVPMatrix*vec4(aPosition,1);
  5. }

片源着色器代码:

  1. precision mediump float;
  2. uniform float uColorR;
  3. uniform float uColorG;
  4. uniform float uColorB;
  5. uniform float uColorA;
  6. void main(){
  7. vec4 finalColor;
  8. finalColor=vec4(uColorR,uColorG,uColorB,uColorA);
  9. gl_FragColor=finalColor;
  10. }

二、创建文理平面的Java代码和Shader Language:

  1. package com.gzdxid.utils;
  2. import java.nio.ByteBuffer;
  3. import java.nio.ByteOrder;
  4. import java.nio.FloatBuffer;
  5. import android.opengl.GLES20;
  6. public class DrawRectTexture {
  7. int mProgram;
  8. int muMVPMatrixHandle;
  9. int maPositionHandle;
  10. int maTexCoorHandle;
  11. FloatBuffer mVertexBuffer;
  12. FloatBuffer mTexCoorBuffer;
  13. int vCount = 0;
  14. public DrawRectTexture(float width, float height, int mProgam) {
  15. // TODO Auto-generated constructor stub
  16. initVertexData(width, height);
  17. intShader(mProgam);
  18. }
  19. private void initVertexData(float width, float height) {
  20. // TODO Auto-generated method stub
  21. vCount = 6;
  22. float w = width / 2;
  23. float h = height / 2;
  24. float vertices[] = new float[] {
  25. -w, h, 0,
  26. -w, -h, 0,
  27. w, -h, 0,
  28. w, -h, 0,
  29. w, h, 0,
  30. -w, h, 0,
  31. };
  32. ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
  33. vbb.order(ByteOrder.nativeOrder());
  34. mVertexBuffer = vbb.asFloatBuffer();
  35. mVertexBuffer.put(vertices);
  36. mVertexBuffer.position(0);
  37. float texCoor[] = new float[] { 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 };
  38. ByteBuffer cbb = ByteBuffer.allocateDirect(texCoor.length * 4);
  39. cbb.order(ByteOrder.nativeOrder());
  40. mTexCoorBuffer = cbb.asFloatBuffer();
  41. mTexCoorBuffer.put(texCoor);
  42. mTexCoorBuffer.position(0);
  43. }
  44. private void intShader(int mProgam) {
  45. // TODO Auto-generated method stub
  46. this.mProgram = mProgam;
  47. muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgam, "uMVPMatrix");
  48. maPositionHandle = GLES20.glGetAttribLocation(mProgam, "aPosition");
  49. maTexCoorHandle = GLES20.glGetAttribLocation(mProgam, "aTexCoor");
  50. }
  51. public void drawSelf(int texId) {
  52. GLES20.glUseProgram(mProgram);
  53. GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);
  54. GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, mVertexBuffer);
  55. GLES20.glVertexAttribPointer(maTexCoorHandle, 2, GLES20.GL_FLOAT, false, 2 * 4, mTexCoorBuffer);
  56. GLES20.glEnableVertexAttribArray(maPositionHandle);
  57. GLES20.glEnableVertexAttribArray(maTexCoorHandle);
  58. GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
  59. GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId);
  60. GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vCount);
  61. }
  62. }

定点着色器代码:

  1. uniform mat4 uMVPMatrix;
  2. attribute vec3 aPosition;
  3. attribute vec2 aTexCoor;
  4. varying vec2 vTextureCoord;
  5. void main(){
  6. gl_Position=uMVPMatrix*vec4(aPosition,1);
  7. vTextureCoord=aTexCoor;
  8. }

片源着色器代码:

  1. precision mediump float;
  2. varying vec2 vTextureCoord;
  3. uniform sampler2D sTexture;
  4. void main(){
  5. gl_FragColor=texture2D(sTexture,vTextureCoord);
  6. }

发表评论

表情:
评论列表 (有 0 条评论,234人围观)

还没有评论,来说两句吧...

相关阅读

    相关 平面分割

    平面分割 描述 Description 【问题描述】   同一平面内有n(n≤500)条直线,已知其中p(p≥2)条直线相交于同一点,则这n条直线最多能将平面分割成