GLSL:重用着色器对象

时间:2014-02-15 20:54:38

标签: python opengl glsl

第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标记了这个问题,因为我的代码示例正在使用该语言,这也可能是导致问题的原因......

0 个答案:

没有答案