[英]Java Android OpenGL ES 2.0 Can't link program
I try to link a basic shader program with a vertex and fragment shader. 我尝试将基本着色器程序与顶点和片段着色器链接。 Both shaders compile successfully, but if I try to link the program the linking always fails.
两个着色器都可以成功编译,但是如果我尝试链接程序,则链接始终会失败。 Whats wrong, why the linking is failing?
怎么了,为什么链接失败了? The info log is empty, but I get GL_INVALID_OPERATION error, when linking.
信息日志为空,但链接时出现GL_INVALID_OPERATION错误。 I run the MAIN code in the "onSurfaceCreated" method from the GLSurfaceView.Renderer interface.
我从GLSurfaceView.Renderer接口的“ onSurfaceCreated”方法中运行MAIN代码。
MAIN: 主要:
String vertexShaderSource = "attribute vec4 a_Position; " +
"void main() " +
"{ " +
" gl_Position = a_Position; " +
"} ";
String fragmentShaderSource = "precision mediump float; " +
"void main() " +
"{ " +
" gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);" +
"} ";
int vertexShaderHandle = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
GLES20.glShaderSource(vertexShaderHandle, vertexShaderSource);
ShaderHelper.compileShader(vertexShaderHandle);
int fragmentShaderHandle = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
GLES20.glShaderSource(fragmentShaderHandle, fragmentShaderSource);
ShaderHelper.compileShader(fragmentShaderHandle);
programHandle = GLES20.glCreateProgram();
GLES20.glAttachShader(programHandle, vertexShaderHandle);
GLES20.glAttachShader(programHandle, fragmentShaderHandle);
ProgramHelper.linkProgram(fragmentShaderHandle);
HELPER: 帮手:
public static void compileShader(int shaderHandle)
{
GLES20.glCompileShader(shaderHandle);
int[] results = new int[1];
GLES20.glGetShaderiv(shaderHandle, GLES20.GL_COMPILE_STATUS, results, 0);
if(results[0] != GLES20.GL_TRUE)
{
String infoLog = GLES20.glGetShaderInfoLog(shaderHandle);
throw new RuntimeException("Failed to compile shader!" + '\n' + infoLog);
}
}
public static void linkProgram(int programHandle)
{
GLES20.glLinkProgram(programHandle);
int[] results = new int[1];
GLES20.glGetProgramiv(programHandle, GLES20.GL_LINK_STATUS, results, 0);
if(results[0] != GLES20.GL_TRUE)
{
String infoLog = GLES20.glGetProgramInfoLog(programHandle);
throw new RuntimeException("Failed to link program!" + '\n' + infoLog);
}
}
EDIT: 编辑:
WTF, the program links fine, if I don't use the helper method to link. WTF,如果我不使用helper方法进行链接,则程序可以很好地链接。 Why???
为什么???
Your code passes the wrong argument to the linkProgram()
method: 您的代码将错误的参数传递给
linkProgram()
方法:
programHandle = GLES20.glCreateProgram();
...
ProgramHelper.linkProgram(fragmentShaderHandle);
As the name suggests, fragmentShaderHandle
is the fragment shader object. 顾名思义,
fragmentShaderHandle
是片段着色器对象。 For linking the program, you need to pass the program object: 要链接程序,您需要传递程序对象:
ProgramHelper.linkProgram(programHandle);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.