GLSL: повторно использовать шейдерный объект
В спецификации OpenGL 4.3 на странице 79 говорится, что
Несколько шейдерных объектов одного типа могут быть присоединены к одному программному объекту, и один шейдерный объект может быть присоединен к более чем одному программному объекту.
Присоединение шейдерного объекта к различным программным объектам работало нормально на старой карте 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, так как мой пример кода использует этот язык, и это может быть также причиной проблемы...