package com.example.datalibrary.gl.utils;
|
|
import android.content.Context;
|
import android.opengl.GLES20;
|
import android.util.Log;
|
|
import java.io.BufferedReader;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.InputStreamReader;
|
|
public class ShaderUtils {
|
private static final String TAG = "ShaderUtils";
|
|
public static boolean checkGlError(String label) {
|
int error;
|
boolean err = true;
|
while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
|
Log.e(TAG, label + ": glError " + error);
|
err = false;
|
}
|
return err;
|
}
|
|
public static int createProgram(String vertexSource, String fragmentSource) {
|
int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
|
if (vertexShader == 0) {
|
return 0;
|
}
|
int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
|
if (pixelShader == 0) {
|
return 0;
|
}
|
int program = GLES20.glCreateProgram();
|
if (program != 0) {
|
GLES20.glAttachShader(program, vertexShader);
|
if (!checkGlError("glAttachShader")){
|
return 0;
|
}
|
GLES20.glAttachShader(program, pixelShader);
|
if (!checkGlError("glAttachShader")){
|
return 0;
|
}
|
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: ");
|
Log.e(TAG, GLES20.glGetProgramInfoLog(program));
|
GLES20.glDeleteProgram(program);
|
program = 0;
|
}
|
}
|
return program;
|
}
|
|
|
public static int loadShader(int shaderType, String source) {
|
int shader = GLES20.glCreateShader(shaderType);
|
if (shader != 0) {
|
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.glGetShaderInfoLog(shader));
|
GLES20.glDeleteShader(shader);
|
shader = 0;
|
}
|
}
|
return shader;
|
}
|
|
public static String readRawTextFile(Context context, int resId) {
|
InputStream inputStream = context.getResources().openRawResource(resId);
|
try {
|
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
|
StringBuilder sb = new StringBuilder();
|
String line;
|
while ((line = reader.readLine()) != null) {
|
sb.append(line).append("\n");
|
}
|
reader.close();
|
return sb.toString();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
}
|