0

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)

この変換を手伝ってくれる人はいますか?

4

1 に答える 1

1

シェーダーのバージョン プロファイルを上げることで問題が解決するとは思えません。#version 330 は OpenGL-3.3 であり、NVidia 製品の Web サイトによると、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 に答える