![[Java] [OpenGL ES 3.x] 程序模板,第1张 [Java] [OpenGL ES 3.x] 程序模板,第1张](/aiimages/%5BJava%5D+%5BOpenGL+ES+3.x%5D+%E7%A8%8B%E5%BA%8F%E6%A8%A1%E6%9D%BF.png)
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条)