/* * * ShaderUtils.java * * Created by Wuwang on 2016/10/8 */ package com.aiyaapp.aiya.util; import android.content.res.Resources; import android.opengl.GLES20; import android.util.Log; import java.io.InputStream; /** * Description: */ public class ShaderUtils { private static final String TAG="ShaderUtils"; private ShaderUtils(){ } public static void checkGLError(String op){ Log.e("wuwang",op); } public static int loadShader(int shaderType,String source){ int shader= GLES20.glCreateShader(shaderType); if(0!=shader){ GLES20.glShaderSource(shader,source); GLES20.glCompileShader(shader); int[] compiled=new int[1]; GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS,compiled,0); if(compiled[0]==0){ Log.e(TAG,"Could not compile shader:"+shaderType); Log.e(TAG,"GLES20 Error:"+ GLES20.glGetShaderInfoLog(shader)); GLES20.glDeleteShader(shader); shader=0; } } return shader; } public static int loadShader(Resources res,int shaderType,String resName){ return loadShader(shaderType,loadFromAssetsFile(resName,res)); } public static int createProgram(String vertexSource, String fragmentSource){ int vertex=loadShader(GLES20.GL_VERTEX_SHADER,vertexSource); if(vertex==0)return 0; int fragment=loadShader(GLES20.GL_FRAGMENT_SHADER,fragmentSource); if(fragment==0)return 0; int program= GLES20.glCreateProgram(); if(program!=0){ GLES20.glAttachShader(program,vertex); checkGLError("Attach Vertex Shader"); GLES20.glAttachShader(program,fragment); checkGLError("Attach Fragment Shader"); GLES20.glLinkProgram(program); int[] linkStatus=new int[1]; GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS,linkStatus,0); if(linkStatus[0]!= GLES20.GL_TRUE){ Log.e(TAG,"Could not link program:"+ GLES20.glGetProgramInfoLog(program)); GLES20.glDeleteProgram(program); program=0; } } return program; } public static int createProgram(Resources res,String vertexRes,String fragmentRes){ return createProgram(loadFromAssetsFile(vertexRes,res),loadFromAssetsFile(fragmentRes,res)); } public static String loadFromAssetsFile(String fname, Resources res){ StringBuilder result=new StringBuilder(); try{ InputStream is=res.getAssets().open(fname); int ch; byte[] buffer=new byte[1024]; while (-1!=(ch=is.read(buffer))){ result.append(new String(buffer,0,ch)); } }catch (Exception e){ return null; } return result.toString().replaceAll("\\r\\n","\n"); } }