package lilin.com.view;
|
|
import android.content.Context;
|
import android.opengl.GLES20;
|
import android.util.Log;
|
|
import java.io.BufferedReader;
|
import java.io.InputStream;
|
import java.io.InputStreamReader;
|
|
public class FFWlShaderUtil {
|
|
|
public static String readRawTxt(Context context, int rawId) {
|
InputStream inputStream = context.getResources().openRawResource(rawId);
|
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
|
StringBuffer sb = new StringBuffer();
|
String line;
|
try
|
{
|
while((line = reader.readLine()) != null)
|
{
|
sb.append(line).append("\n");
|
}
|
reader.close();
|
}
|
catch (Exception e) { e.printStackTrace(); }
|
return sb.toString();
|
}
|
|
public static int loadShader(int shaderType, String source)
|
{
|
int shader = GLES20.glCreateShader(shaderType);
|
if(shader != 0)
|
{
|
GLES20.glShaderSource(shader, source);
|
GLES20.glCompileShader(shader);
|
int[] compile = new int[1];
|
GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compile, 0);
|
if(compile[0] != GLES20.GL_TRUE)
|
{
|
Log.d("lilin", "shader compile error");
|
GLES20.glDeleteShader(shader);
|
shader = 0;
|
}
|
}
|
return shader;
|
}
|
|
public static int createProgram(String vertexSource, String fragmentSource)
|
{
|
int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
|
if(vertexShader == 0)
|
{
|
return 0;
|
}
|
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
|
if(fragmentShader == 0)
|
{
|
return 0;
|
}
|
int program = GLES20.glCreateProgram();
|
if(program != 0)
|
{
|
GLES20.glAttachShader(program, vertexShader);
|
GLES20.glAttachShader(program, fragmentShader);
|
GLES20.glLinkProgram(program);
|
int[] linsStatus = new int[1];
|
GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linsStatus, 0);
|
if(linsStatus[0] != GLES20.GL_TRUE)
|
{
|
Log.d("lilin", "link program error");
|
GLES20.glDeleteProgram(program);
|
program = 0;
|
}
|
}
|
return program;
|
|
}
|
|
}
|