[Java] [OpenGL ES 3.x] 程序模板

[Java] [OpenGL ES 3.x] 程序模板,第1张

[Java] [OpenGL ES 3.x] 程序模板

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);
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5700573.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存