7

問題:

私はhttp://www.arcsynthesis.org/gltut/index.htmlチュートリアルからOpenGLを学んでいますが、チュートリアル 13: Geometry Impostorsを機能させるのに非常に苦労しました (6 時間以上)。実際には何の操作もしないはずのコードの小さな変更です。なぜそれが何かを変更するのかを知るためにあなたの助けが必要です.

説明 - 編集:

問題は、変更されていないコードではフラグメント シェーダーがジオメトリ シェーダーから正しい入力を取得できなかったことですが、ジオメトリ シェーダーの出力インターフェイス ブロックを個別の変数に置き換えるか、ブロックにインスタンス名を付けると、プログラムが正常に動作するようになります。ただし、これらの変更はノーオペレーションである必要があります。

問題はおそらく名前の衝突です。

このように動作しません:

in VertexData
{
    vec3 cameraSpherePos;
    float sphereRadius;
} vert[];

out FragData
{
    flat vec3 cameraSpherePos;
    flat float sphereRadius;
    smooth vec2 mapping;
};

void main()
{
     mapping = 
     cameraSpherePos = 
     sphereRadius = 
     EmitVertex();
     /* mapping's value doesn't get to the fragment shader correctly */
}

ただし、FragData に frag のようなインスタンス名を付け、マッピングの代わりに frag.mappaing を使用するか、3 つの個別の変数を使用すると、問題が解決します。

インスタンス名がないと機能しないのはなぜですか?

編集:ドライバーの問題のようです。

4

3 に答える 3

2

次のようなすべてのインターフェイス ブロックのインスタンス名を作成します。

FragData { /* ... */ } gs2fs; 

その後:

gs2fs.cameraCornerPos = vec4(vert[0].cameraSpherePos, 1.0);
于 2013-05-20T16:04:51.603 に答える
2

問題は、実際には最新のドライバーを使用していないことにありました。

これをLinuxで実行していて、Ubuntuのパッケージマネージャーから最新のドライバーを取得しました:Nvidia 310-experimental. しかし、実験的とはいえ、かなり古いものです。nvidia のサイトから 319 を手動でインストールすると、コードは変更なしで正常に動作しました。

この話の教訓:

常に最新のドライバーを使用してください。

于 2013-05-21T12:49:50.253 に答える
2

厄介なバージョンの問題が原因で、GLSL サンプルの操作が面倒になることがよくあります。

一般的なデバッグのアドバイス:

  • シェーダー ソースに適切なバージョン タグが含まれていることを確認します
  • を呼び出して、OpenGL ドライバーが実際にそのバージョンをサポートしていることを確認します。glGetString(GL_SHADING_LANGUAGE_VERSION)
  • ランタイム シェーダー再コンパイルの手段を作成する (たとえば、それをキー イベントに割り当てることによって)
  • そして何よりも:glGetShaderInfoLog()glGetProgramInfoLog()!を使用してください。
于 2013-05-20T05:11:23.850 に答える