0

我有以下与 GLSL #130 完美配合的着色器代码,但我想将其转换为适用于版本 #330 的代码(因为不知何故,#130 版本在我的带有 Geforce 210 的 Ubuntu 机器上不起作用; 着色器什么都不做)。经过几次失败的尝试(我不断收到未描述的链接错误),我决定寻求一些帮助。下面的代码使用统一变量 Brightness 和 Contrast 动态更改纹理的对比度和亮度。我已经使用 PyOpenGL 在 Python 中实现了它:

def createShader():
     """
     Compile a shader that adjusts contrast and brightness of active texture
     Returns
         OpenGL.shader - reference to shader
         dict - reference to variables that can be passed to the shader
     """

     fragmentShader = shaders.compileShader("""#version 130
     uniform sampler2D Texture;
     uniform float Brightness;
     uniform float Contrast;
     uniform vec4 AverageLuminance;

     void main(void)
     {
         vec4 texColour = texture2D(Texture, gl_TexCoord[0].st);
         gl_FragColor = mix(texColour * Brightness, 
                        mix(AverageLuminance, texColour, Contrast), 0.5);
     }
     """, GL_FRAGMENT_SHADER)
     shader = shaders.compileProgram(fragmentShader)

     uniform_locations = {
          'Brightness': glGetUniformLocation( shader, 'Brightness' ),
          'Contrast': glGetUniformLocation( shader, 'Contrast' ),
          'AverageLuminance': glGetUniformLocation( shader, 'AverageLuminance' ),
          'Texture': glGetUniformLocation( shader, 'Texture' )
     }
     return shader, uniform_locations

我查看了需要为新的 GLSL 版本进行的更改,并尝试将片段着色器代码更改为以下内容,但随后只会出现非描述性链接错误:

fragmentShader = shaders.compileShader("""#version 330
uniform sampler2D Texture;
uniform float Brightness;
uniform float Contrast;
uniform vec4 AverageLuminance;
in vec2 TexCoord;
out vec4 FragColor;

void main(void)
{
    vec4 texColour = texture2D(Texture, TexCoord);
    FragColor = mix(texColour * Brightness, 
                mix(AverageLuminance, texColour, Contrast), 0.5);
}
""", GL_FRAGMENT_SHADER)

有没有人可以帮助我进行这种转换?

4

1 回答 1

1

我怀疑提高着色器版本配置文件会解决任何问题。#version 330 是 OpenGL-3.3,根据 NVidia 产品网站,GeForce 210 支持的最大 OpenGL 版本是 OpenGL-3.1,即 #version 140

我没有创建顶点着色器,因为我认为我不需要一个(我不知道我应该做什么)。它以前也可以在没有任何顶点着色器的情况下工作。

可能只有在您不使用片段着色器或在尝试使用纹理之前。片段着色器需要来自顶点着色器的输入变量,才能将其用作纹理坐标。TexCoord不是内置变量(并且对于更高的 GLSL 版本,任何适合该作业的内置变量都已删除),因此您需要在顶点着色器中用值(和感觉)填充它。

NVidia 机器上的 glGetString(GL_VERSION) 读取 OpenGL 版本 3.3.0。这是 Ubuntu,所以它可能与 Windows 规格不同?

您是否安装了 NVidia 专有驱动程序?它们真的被使用了吗?检查 glxinfo 或glGetString(GL_RENDERER). OpenGL-3.3 与 OpenGL-3.1 相差不远,理论上 OpenGL 主要版本映射到硬件能力。

于 2013-01-15T13:34:55.123 回答