[英]Java Android OpenGL ES 2.0 Can't link program
我嘗試將基本着色器程序與頂點和片段着色器鏈接。 兩個着色器都可以成功編譯,但是如果我嘗試鏈接程序,則鏈接始終會失敗。 怎么了,為什么鏈接失敗了? 信息日志為空,但鏈接時出現GL_INVALID_OPERATION錯誤。 我從GLSurfaceView.Renderer接口的“ onSurfaceCreated”方法中運行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);
幫手:
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);
}
}
編輯:
WTF,如果我不使用helper方法進行鏈接,則程序可以很好地鏈接。 為什么???
您的代碼將錯誤的參數傳遞給linkProgram()
方法:
programHandle = GLES20.glCreateProgram();
...
ProgramHelper.linkProgram(fragmentShaderHandle);
顧名思義, fragmentShaderHandle
是片段着色器對象。 要鏈接程序,您需要傳遞程序對象:
ProgramHelper.linkProgram(programHandle);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.