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, так как мой пример кода использует этот язык, и это может быть также причиной проблемы...

0 ответов

Другие вопросы по тегам