Advertisement
Guest User

android res trick

a guest
Sep 26th, 2012
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.36 KB | None | 0 0
  1. package prod.demo.intro;
  2. import java.nio.ByteBuffer;
  3. import java.nio.ByteOrder;
  4. import java.nio.FloatBuffer;
  5. import java.nio.IntBuffer;
  6. import javax.microedition.khronos.egl.EGLConfig;
  7. import javax.microedition.khronos.opengles.GL10;
  8. import android.content.Context;
  9. import android.opengl.GLES20;
  10. import android.opengl.GLSurfaceView;
  11. import android.opengl.Matrix;
  12. import android.os.SystemClock;
  13. import android.util.Log;
  14. class IntroRenderer implements GLSurfaceView.Renderer {
  15.   private float[] v = {
  16.     -1.0f,-1.0f,
  17.     -1.0f,1.0f,
  18.     1.0f,1.0f,
  19.     -1.0f,-1.0f,
  20.     1.0f,1.0f,
  21.     1.0f,-1.0f
  22.   };
  23.   private float[] uv = {
  24.     -1.0f,-1.0f,
  25.     -1.0f,1.0f,
  26.     1.0f,1.0f,
  27.     -1.0f,-1.0f,
  28.     1.0f,1.0f,
  29.     1.0f,-1.0f
  30.   };
  31.   private FloatBuffer vbuf;
  32.   private FloatBuffer uvbuf;
  33.   private int fb[] = new int[1];
  34.   private int drb[] = new int[1];
  35.   private int tex[] = new int[1];
  36.   private final String vs =
  37.     "attribute vec4 apos;\n"+
  38.       "attribute vec2 atex;\n"+
  39.       "varying vec2 vtex;\n"+
  40.       "void main() {\n"+
  41.       "  gl_Position = apos;\n"+
  42.       "  vtex = atex;\n"+
  43.       "}\n";
  44.   private final String fs =
  45.     "precision mediump float;\n"+
  46.       "varying vec2 vtex;\n"+
  47.       "void main() {\n"+
  48.       "  gl_FragColor = vec4(abs(vtex.x),abs(vtex.y),0.0,1.0);\n"+
  49.       "}\n";
  50.   private final String texvs =
  51.     "attribute vec4 aPosition;\n"+
  52.       "attribute vec2 aTextureCoord;\n"+
  53.       "varying vec2 vTextureCoord;\n"+
  54.       "void main() {\n"+
  55.       "  gl_Position = aPosition;\n"+
  56.       "  vTextureCoord = aTextureCoord;\n"+
  57.       "}\n";
  58.   private final String texfs =
  59.     "precision mediump float;\n"+
  60.       "varying vec2 vTextureCoord;\n"+
  61.       "uniform sampler2D sTexture;\n"+
  62.       "void main() {\n"+
  63.       "  gl_FragColor = texture2D(sTexture, vTextureCoord);\n"+
  64.       "}\n";
  65.   private int prog, texprog;
  66.   private static String TAG = "GLES20TriangleRenderer";
  67.   public IntroRenderer(Context context) {
  68.     vbuf = ByteBuffer.allocateDirect(v.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
  69.     vbuf.put(v).position(0);
  70.     uvbuf = ByteBuffer.allocateDirect(uv.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
  71.     uvbuf.put(uv).position(0);
  72.   }
  73.   static long lastTime = SystemClock.uptimeMillis();
  74.   static long frameCount = 0;
  75.   int texresx, texresy;
  76.   IntBuffer texbuf;
  77.   private void generateTexture() {
  78.     GLES20.glGenFramebuffers(1,fb,0);
  79.     GLES20.glGenRenderbuffers(1,drb,0);
  80.     GLES20.glGenTextures(1,tex,0);
  81.     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,tex[0]);
  82.     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE);
  83.     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_CLAMP_TO_EDGE);
  84.     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_NEAREST);
  85.     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_NEAREST);
  86.     int[] buf = new int[texresx*texresy];
  87.     texbuf = ByteBuffer.allocateDirect(buf.length*4).order(ByteOrder.nativeOrder()).asIntBuffer();
  88.     GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D,0,GLES20.GL_RGB,texresx,texresy,0,GLES20.GL_RGB,GLES20.GL_UNSIGNED_SHORT_5_6_5,texbuf);
  89.     GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER,drb[0]);
  90.     GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER,GLES20.GL_DEPTH_COMPONENT16,texresx,texresy);
  91.   }
  92.   public void onDrawFrame(GL10 glUnused) {
  93.     frameCount++;
  94.     long time = SystemClock.uptimeMillis();
  95.     if(time>lastTime+1000) {
  96.       System.out.println("fps: "+frameCount);
  97.       frameCount = 0;
  98.       lastTime = time;
  99.     }
  100.     // setup render to texture
  101.     // GLES20.glViewport(0,0,texresx,texresy);
  102.     // GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,fb[0]);
  103.     // GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER,GLES20.GL_COLOR_ATTACHMENT0,GLES20.GL_TEXTURE_2D,tex[0],0);
  104.     // GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER,GLES20.GL_DEPTH_ATTACHMENT,GLES20.GL_RENDERBUFFER,drb[0]);
  105.     // render shader
  106.     GLES20.glViewport(0,0,xres,yres);
  107.     GLES20.glUseProgram(prog);
  108.     GLES20.glClearColor(0.0f,0.0f,0.0f,1.0f);
  109.     GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT|GLES20.GL_COLOR_BUFFER_BIT);
  110.     GLES20.glVertexAttribPointer(GLES20.glGetAttribLocation(prog,"apos"),2,GLES20.GL_FLOAT,false,2*4,vbuf);
  111.     GLES20.glEnableVertexAttribArray(GLES20.glGetAttribLocation(prog,"apos"));
  112.     GLES20.glVertexAttribPointer(GLES20.glGetAttribLocation(prog,"atex"),2,GLES20.GL_FLOAT,false,2*4,uvbuf);
  113.     GLES20.glEnableVertexAttribArray(GLES20.glGetAttribLocation(prog,"atex"));
  114.     GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,v.length/2);
  115.     // render texture
  116.     // GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,0);
  117.     // GLES20.glViewport(0,0,xres,yres);
  118.     // GLES20.glUseProgram(texprog);
  119.     // GLES20.glClearColor(0.0f,0.0f,0.0f,1.0f);
  120.     // GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT|GLES20.GL_COLOR_BUFFER_BIT);
  121.     // send vertex coords
  122.     // GLES20.glVertexAttribPointer(GLES20.glGetAttribLocation(texprog,"aPositionCoord"),2,GLES20.GL_FLOAT,false,2*4,vbuf);
  123.     // GLES20.glEnableVertexAttribArray(GLES20.glGetAttribLocation(texprog,"aPositionCoord"));
  124.     // bind framebuffer texture
  125.     // GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
  126.     // GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,tex[0]);
  127.     // GLES20.glUniform1i(GLES20.glGetUniformLocation(texprog,"texture1"),0);
  128.     // GLES20.glUniform1f(GLES20.glGetUniformLocation(texprog,"hasTexture"),1.0f);
  129.     // GLES20.glVertexAttribPointer(GLES20.glGetAttribLocation(texprog,"aTextureCoord"),2,GLES20.GL_FLOAT,false,2*4,uvbuf);
  130.     // GLES20.glEnableVertexAttribArray(GLES20.glGetAttribLocation(texprog,"aTextureCoord"));
  131.     // GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,v.length/2);
  132.   }
  133.   private int xres, yres;
  134.   public void onSurfaceChanged(GL10 glUnused, int width, int height) {
  135.     GLES20.glViewport(0,0,width,height);
  136.     xres = width;
  137.     yres = height;
  138.     float ratio = (float)width/height;
  139.     // float tempuv[] = {
  140.     // -ratio,-1.0f,
  141.     // -ratio,1.0f,
  142.     // ratio,1.0f,
  143.     // -ratio,-1.0f,
  144.     // ratio,1.0f,
  145.     // ratio,-1.0f
  146.     // };
  147.     float tempuv[] = {
  148.       -1.0f,-1.0f,
  149.       -1.0f,1.0f,
  150.       1.0f,1.0f,
  151.       -1.0f,-1.0f,
  152.       1.0f,1.0f,
  153.       1.0f,-1.0f
  154.     };
  155.     uv = tempuv;
  156.     uvbuf = ByteBuffer.allocateDirect(uv.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
  157.     uvbuf.put(uv).position(0);
  158.     texresx = xres/64;
  159.     texresy = yres/64;
  160.     generateTexture();
  161.   }
  162.   public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
  163.     prog = createProgram(vs,fs);
  164.     texprog = createProgram(texvs,texfs);
  165.   }
  166.   private int loadShader(int shaderType, String source) {
  167.     int shader = GLES20.glCreateShader(shaderType);
  168.     if(shader!=0) {
  169.       GLES20.glShaderSource(shader,source);
  170.       GLES20.glCompileShader(shader);
  171.       int[] compiled = new int[1];
  172.       GLES20.glGetShaderiv(shader,GLES20.GL_COMPILE_STATUS,compiled,0);
  173.       if(compiled[0]==0) {
  174.         Log.e(TAG,"Could not compile shader "+shaderType+":");
  175.         Log.e(TAG,GLES20.glGetShaderInfoLog(shader));
  176.         GLES20.glDeleteShader(shader);
  177.         shader = 0;
  178.       }
  179.     }
  180.     return shader;
  181.   }
  182.   private int createProgram(String vertexSource, String fragmentSource) {
  183.     int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER,vertexSource);
  184.     if(vertexShader==0) {
  185.       return 0;
  186.     }
  187.     int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER,fragmentSource);
  188.     if(pixelShader==0) {
  189.       return 0;
  190.     }
  191.     int program = GLES20.glCreateProgram();
  192.     if(program!=0) {
  193.       GLES20.glAttachShader(program,vertexShader);
  194.       checkGlError("glAttachShader");
  195.       GLES20.glAttachShader(program,pixelShader);
  196.       checkGlError("glAttachShader");
  197.       GLES20.glLinkProgram(program);
  198.       int[] linkStatus = new int[1];
  199.       GLES20.glGetProgramiv(program,GLES20.GL_LINK_STATUS,linkStatus,0);
  200.       if(linkStatus[0]!=GLES20.GL_TRUE) {
  201.         Log.e(TAG,"Could not link program: ");
  202.         Log.e(TAG,GLES20.glGetProgramInfoLog(program));
  203.         GLES20.glDeleteProgram(program);
  204.         program = 0;
  205.       }
  206.     }
  207.     return program;
  208.   }
  209.   private void checkGlError(String op) {
  210.     int error;
  211.     while ((error = GLES20.glGetError())!=GLES20.GL_NO_ERROR) {
  212.       Log.e(TAG,op+": glError "+error);
  213.       throw new RuntimeException(op+": glError "+error);
  214.     }
  215.   }
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement