/*
|
* Copyright (C) 2018 Baidu, Inc. All Rights Reserved.
|
*/
|
package com.example.datalibrary.view;
|
|
import android.opengl.GLES20;
|
import android.util.Log;
|
|
public class ImiShaderUtil {
|
|
public static int createProgram(String vertexSource, String fragmentSource) {
|
int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
|
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
|
// 创建一个空的OpenGL ES Program
|
int program = GLES20.glCreateProgram();
|
if (vertexShader == 0 || fragmentShader == 0 || program == 0) {
|
return 0;
|
}
|
// 将vertex shader添加到program
|
GLES20.glAttachShader(program, vertexShader);
|
checkGlError("glAttachShader");
|
// 将fragment shader添加到program
|
GLES20.glAttachShader(program, fragmentShader);
|
checkGlError("glAttachShader");
|
// 创建可执行的 OpenGL ES program
|
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("ES20_ERROR", "Could not link program: ");
|
Log.e("ES20_ERROR", GLES20.glGetProgramInfoLog(program));
|
GLES20.glDeleteProgram(program);
|
program = 0;
|
}
|
return program;
|
}
|
|
private static int loadShader(int shaderType, String source) {
|
// 创建一个vertex shader类型(GLES20.GL_VERTEX_SHADER)
|
// 或fragment shader类型(GLES20.GL_FRAGMENT_SHADER)
|
int shader = GLES20.glCreateShader(shaderType);
|
if (shader != 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("ES20_ERROR", "Could not compile shader " + shaderType
|
+ ":");
|
Log.e("ES20_ERROR", GLES20.glGetShaderInfoLog(shader));
|
GLES20.glDeleteShader(shader);
|
shader = 0;
|
}
|
}
|
return shader;
|
}
|
|
public static void checkGlError(String op) {
|
int error;
|
while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
|
Log.e("ES20_ERROR", op + ": glError " + error);
|
// throw new RuntimeException(op + ": glError " + error);
|
}
|
}
|
}
|