MainActivity.java
package com.Diamond.example; import android.app.Activity; import android.os.Bundle; import com.Diamond.example.MySurfaceView; public class MainActivity extends Activity { public MySurfaceView surfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); surfaceView = new MySurfaceView(this); setContentView(surfaceView); surfaceView.requestFocus(); surfaceView.setFocusableInTouchMode(true); } @Override protected void onResume() { super.onResume(); surfaceView.onResume(); } @Override protected void onPause() { super.onPause(); surfaceView.onPause(); } }
MySurfaceView.java
package com.Diamond.example; import android.opengl.*; import android.opengl.GLES32; import android.opengl.GLSurfaceView; import android.content.Context; import javax.microedition.khronos.opengles.GL10; import javax.microedition.khronos.egl.EGLConfig; public class MySurfaceView extends GLSurfaceView { public class MyRenderer implements GLSurfaceView.Renderer { @Override public void onSurfaceCreated(GL10 p1, EGLConfig p2) { } @Override public void onSurfaceChanged(GL10 p1, int p2, int p3) { } @Override public void onDrawframe(GL10 p1) { } } private MyRender renderer; public MySurfaceView(Context context) { super(context); this.setEGLContextClientVersion(3); renderer = new MyRenderer(); this.setRenderer(renderer); this.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); } }
Program.java
package com.Diamond.example; import android.opengl.GLES32; import android.util.Log; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.IOException; import android.renderscript.Float2; import android.renderscript.Float3; import android.renderscript.Float4; import java.io.InputStream; import android.content.res.Resources; import java.io.ByteArrayOutputStream; public class Program { public class Shader { private int program; private int type; public final String tag = "failed to load shader"; private void loadShader(String resource) { program = GLES32.glCreateShader(type); if (program == 0) { Log.e(tag, "shader program type:" + type); Log.e(tag, "error:" + GLES32.glGetError()); return; } GLES32.glShaderSource(program, resource); GLES32.glCompileShader(program); int[] compiled = new int[1]; GLES32.glGetShaderiv(program, GLES32.GL_COMPILE_STATUS, compiled, 0); if (compiled[0] == 0) { Log.e(tag, GLES32.glGetShaderInfoLog(program)); GLES32.glDeleteShader(program); program = 0; } } public Shader(int programType) { program = 0; type = programType; } public Shader(int programType, String resource) { type = programType; loadShader(resource); } public int getProgram() { return program; } } private Shader vShader; private Shader fShader; private Shader gShader; private int program; private final String tag = "failed to create program"; private void linkProgram() { int vp = vShader.getProgram(); int fp = fShader.getProgram(); int gp = gShader.getProgram(); program = GLES32.glCreateProgram(); if (program == 0) { Log.e(tag, "" + GLES32.glGetError()); return; } GLES32.glAttachShader(program, vp); GLES32.glAttachShader(program, fp); if (gp != 0) { GLES32.glAttachShader(program, gp); } GLES32.gllinkProgram(program); int[] linkStatus = new int[1]; GLES32.glGetProgramiv(program, GLES32.GL_link_STATUS, linkStatus, 0); if (linkStatus[0] == GLES32.GL_FALSE) { Log.e(tag, GLES32.glGetProgramInfoLog(program)); GLES32.glDeleteProgram(program); program = 0; } } public Program() { vShader = new Shader(GLES32.GL_VERTEX_SHADER); fShader = new Shader(GLES32.GL_FRAGMENT_SHADER); gShader = new Shader(GLES32.GL_GEOMETRY_SHADER); linkProgram(); } public Program(String vResource, String fResource) { vShader = new Shader(GLES32.GL_VERTEX_SHADER, vResource); fShader = new Shader(GLES32.GL_FRAGMENT_SHADER, fResource); gShader = new Shader(GLES32.GL_GEOMETRY_SHADER); linkProgram(); } public Program(String vResource, String fResource, String gResource) { vShader = new Shader(GLES32.GL_VERTEX_SHADER, vResource); fShader = new Shader(GLES32.GL_FRAGMENT_SHADER, fResource); gShader = new Shader(GLES32.GL_GEOMETRY_SHADER, gResource); linkProgram(); } public int getProgram() { return program; } public void useProgram() { GLES32.glUseProgram(program); } public static String loadFromAssetsFile(String fname, Resources resources) { String result=null; try { InputStream in=resources.getAssets().open(fname); int ch=0; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ((ch = in.read()) != -1) { baos.write(ch); } byte[] buff=baos.toByteArray(); baos.close(); in.close(); result = new String(buff, "UTF-8"); result = result.replaceAll("\r\n", "n"); } catch (Exception e) { e.printStackTrace(); } return result; } public int getUniformLocation(String name) { return GLES32.glGetUniformLocation(program, name); } public void setUniform(String name, float value) { int location = getUniformLocation(name); GLES32.glUniform1f(location, value); } public void setUniform(String name, int value) { int location = getUniformLocation(name); GLES32.glUniform1i(location, value); } public void setUniform(String name, float value1, float value2) { int location = getUniformLocation(name); GLES32.glUniform2f(location, value1, value2); } public void setUniform(String name, Float2 value) { setUniform(name, value.x, value.y); } public void setUniform(String name, float value1, float value2, float value3) { int location = getUniformLocation(name); GLES32.glUniform3f(location, value1, value2, value3); } public void setUniform(String name, Float3 value) { setUniform(name, value.x, value.y, value.z); } public void setUniform(String name, float value1, float value2, float value3, float value4) { int location = getUniformLocation(name); GLES32.glUniform4f(location, value1, value2, value3, value4); } public void setUniform(String name, Float4 value) { setUniform(name, value.x, value.y, value.z, value.w); } public void setUniform(String name, float[] matrix) { int location = getUniformLocation(name); GLES32.glUniformMatrix4fv(location, 1, false, matrix, 0); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)