GLSL #130 で完全に動作する次のシェーダー コードがありますが、バージョン #330 で動作するコードに変換したいと思います (どういうわけか、Geforce 210 を搭載した Ubuntu マシンでは #130 バージョンが動作しないため)。 ; シェーダーは何もしません)。何回か失敗した後 (説明されていないリンク エラーが発生し続けます)、助けを求めることにしました。以下のコードは、均一な変数 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)
この変換を手伝ってくれる人はいますか?