Android OpenGL ES 2.0着色器--错误在哪一行?
在android OpenGL ES 2.0着色器中,如果出现错误,如何找出错误所在的着色器行??我有一些这样的代码:Android OpenGL ES 2.0着色器--错误在哪一行?,android,opengl-es,Android,Opengl Es,在android OpenGL ES 2.0着色器中,如果出现错误,如何找出错误所在的着色器行??我有一些这样的代码: public static int loadShader(int type, String shaderCode){ int shader = GLES20.glCreateShader(type); // add the source code to the shader and compile it GLES20.glSha
public static int loadShader(int type, String shaderCode){
int shader = GLES20.glCreateShader(type);
// add the source code to the shader and compile it
GLES20.glShaderSource(shader, shaderCode);
GLES20.glCompileShader(shader);
final int[] compileStatus = new int[1];
GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
if (compileStatus[0] != 1) { // 1 is normal output
if (type == GLES20.GL_VERTEX_SHADER) {
System.out.println("vertex -- ");
}
else if (type == GLES20.GL_FRAGMENT_SHADER) {
System.out.println("fragment -- ");
}
System.out.println(type + " error " + compileStatus[0]);
if (compileStatus[0] == GLES20.GL_TRUE) System.out.println("true");
}
return shader;
}
它总是说我的着色器构建正确。同时,我稍后运行此代码:
System.out.println(GLES20.glGetShaderInfoLog(mProgramHandle));
它说我有一个错误。这是错误消息:
W/Adreno-ES20﹕ <core_glGetShaderiv:443>: GL_INVALID_OPERATION
您是否认为mProgramHandle指向有效的着色器句柄?对我来说,glGetShaderInfoLog似乎产生了GL_INVALID_操作如果变量命名有任何指示,
mProgramHandle
很可能是程序句柄,而不是着色器句柄。那么你是说我应该在glGetShaderInfoLog命令中放置mVertexShader或mfFragmentShader?如果我这样做,就不会有任何类型的错误消息。我稍微编辑了我的原始帖子,以包含更多使用着色器加载程序的代码。这是我一直面临的问题,我可以让这段代码在一台设备上运行,但当我在任何其他设备上测试它时,它都不起作用。当我在一台“有问题”的设备上启动应用程序时,我正在寻找的图像似乎在屏幕上闪烁。错误日志似乎不够有用。我想任何建议都是欢迎的。
private int prepGLShader() {
int mProgramHandle = 0;
mProgramHandle = GLES20.glCreateProgram(); // create empty OpenGL ES Program
String vertex = readTextFileFromRawResource(context, R.raw.vert_mask);
String fragment = readTextFileFromRawResource(context, R.raw.frag_mask);
mVertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertex);
mFragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragment);
GLES20.glAttachShader(mProgramHandle, mVertexShader); // add the vertex shader to program
GLES20.glAttachShader(mProgramHandle, mFragmentShader); // add the fragment shader to program
GLES20.glBindAttribLocation(mProgramHandle, 0, "a_Position");
GLES20.glBindAttribLocation(mProgramHandle, 1, "a_TexCoordinate");
GLES20.glLinkProgram(mProgramHandle);
return mProgramHandle;
}