第79页的OpenGL 4.3 Specification个状态
可以将同一类型的多个着色器对象附加到单个程序 对象和单个着色器对象可以附加到多个程序对象。
将着色器对象附加到不同的程序对象在旧的Nvidia卡上正常工作但在Radeon HD 7850上失败。
这是一个最小的例子,我用它在将相同的着色器链接到两个不同的程序时重现错误:
#!/bin/env python3
from OpenGL.GL import *
from OpenGL.GLUT import *
def compile_shader(source, shadertype):
shader = glCreateShader(shadertype)
glShaderSource(shader, source)
glCompileShader(shader)
if not glGetShaderiv(shader, GL_COMPILE_STATUS):
print(glGetShaderInfoLog(shader).decode())
return shader
def link_program(*shaders):
prog = glCreateProgram()
for shader in shaders:
glAttachShader(prog, shader)
glLinkProgram(prog)
glValidateProgram(prog)
print(glGetProgramInfoLog(prog).decode())
return prog
glutInit('')
glutInitContextVersion(4, 3)
hwnd = glutCreateWindow(b'Shader Test')
print(glGetString(GL_VERSION).decode())
vtx_src = """#version 330 compatibility\nvoid main() { gl_Position = vec4(1, 1, 1, 1); }"""
frg_src = """#version 330 compatibility\nvoid main() { gl_FragColor = vec4(1, 1, 1, 1); }"""
v1 = compile_shader(vtx_src, GL_VERTEX_SHADER)
f1 = compile_shader(frg_src, GL_FRAGMENT_SHADER)
link_program(v1, f1) # works
link_program(v1, f1) # fails
输出:
4.3.12780 Core Profile Context 9.00.11
Validation successful.
Vertex shader(s) failed to link, fragment shader(s) failed to link.
Vertex link error: INVALID_OPERATION.
ERROR: 1:1: error(#132) Syntax error: "v" parse error
ERROR: error(#273) 1 compilation errors. No code generated
fragment link error: INVALID_OPERATION.
ERROR: 1:1: error(#132) Syntax error: "v" parse error
ERROR: error(#273) 1 compilation errors. No code generated
我在这里做错了吗?
在链接期间解析着色器源的错误消息,这对我来说似乎很奇怪。毕竟,着色器之前已成功编译(也已链接)。
我用Python标记了这个问题,因为我的代码示例正在使用该语言,这也可能是导致问题的原因......