使用go-gl绑定GLSL片段着色器编译失败无报错信息求助
问题
使用go-gl的OpenGL绑定库,定义了顶点和片段着色器源码:
const vertexShaderSource = `#version 460 compatibility layout (location = 0) in vec3 aPos; void main() { gl_Position = vec4(aPos, 1.0); }` + "\x00" const fragmentShaderSource = `#version 460 compatibility out vec4 FragColor; void main() { FragColor = vec4(0.5f, 0.1f, 0.1f, 1.0f); }` + "\x00"
顶点着色器创建编译正常,但片段着色器编译失败,且无日志输出。片段着色器创建代码如下:
fragmentShader := gl.CreateShader(gl.FRAGMENT_SHADER) fragmentShaderSourceC := gl.Str(fragmentShaderSource) gl.ShaderSource(fragmentShader, 1, &fragmentShaderSourceC, nil) gl.GetShaderiv(fragmentShader, gl.COMPILE_STATUS, &success) if success != gl.TRUE { var length int32 infoLogC := [LOGSIZE]uint8{} gl.GetShaderInfoLog(fragmentShader, LOGSIZE, &length, &infoLogC[0]) infoLog := gl.GoStr(&infoLogC[0]) fmt.Printf("Got failure from fragment shader: %s\n", infoLog) fmt.Printf("gl version: %s\n", gl.GoStr(gl.GetString(gl.VERSION))) fmt.Printf("gl vendor: %s\n", gl.GoStr(gl.GetString(gl.VENDOR))) return }
运行输出:
Got failure from fragment shader: gl version: 4.6 (Compatibility Profile) Mesa 23.0.4-0ubuntu1~23.04.1 gl vendor: Intel
尝试切换core/compatibility模式、修改输出变量名、调整颜色值均无效,跳过判断继续创建程序会提示error: linking with uncompiled/unspecialized shader。
解决方案
你的片段着色器代码遗漏了编译步骤:在调用gl.ShaderSource设置源码后,必须调用gl.CompileShader(fragmentShader)触发编译,之后再检查COMPILE_STATUS。
修改后的片段着色器创建代码:
fragmentShader := gl.CreateShader(gl.FRAGMENT_SHADER) fragmentShaderSourceC := gl.Str(fragmentShaderSource) gl.ShaderSource(fragmentShader, 1, &fragmentShaderSourceC, nil) // 新增编译调用 gl.CompileShader(fragmentShader) gl.GetShaderiv(fragmentShader, gl.COMPILE_STATUS, &success) if success != gl.TRUE { var length int32 infoLogC := [LOGSIZE]uint8{} gl.GetShaderInfoLog(fragmentShader, LOGSIZE, &length, &infoLogC[0]) infoLog := gl.GoStr(&infoLogC[0]) fmt.Printf("Got failure from fragment shader: %s\n", infoLog) fmt.Printf("gl version: %s\n", gl.GoStr(gl.GetString(gl.VERSION))) fmt.Printf("gl vendor: %s\n", gl.GoStr(gl.GetString(gl.VENDOR))) return }
因为之前没有执行编译操作,着色器处于未编译状态,所以COMPILE_STATUS为FALSE,同时没有编译日志(根本没进行编译过程)。加上gl.CompileShader后,就能正常触发编译流程,若仍有错误也会生成对应的日志信息。
内容的提问来源于stack exchange,提问作者stromsy
相关产品推荐
相关产品推荐

