5

「クローズド ソース」アプリケーション内で実行されるプラグインの一部として、glsl シェーダー プログラムに取り組んでいます。アプリケーション (maya) は opengl 2.1 を使用して作成されていますが、グラフィックス カードは opengl/glsl 4.1 をサポートしており、プログラムでテッセレーションとジオメトリ シェーダーを使用したいと考えています。アプリケーションは、opengl ビューポートと従来のモデル/ビュー マトリックス スタックをセットアップしますが、コードのその部分を制御することはできません。

私のパススルー頂点シェーダーは GLSL 1.2 を使用し、正常に動作します。

// GLSL VERTEX SHADER
#version 120

void main ()
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

私のパススルー ジオメトリ シェーダは glsl 4.1 を使用し、アプリケーション内でも正常に動作します。

// GLSL GEOMETRY SHADER
#version 410

layout (lines_adjacency) in;
layout (line_strip, max_vertices = 2) out;

void main ()
{
    gl_Position = gl_in[1].gl_Position;
    EmitVertex();
    gl_Position = gl_in[2].gl_Position;
    EmitVertex();
    EndPrimitive();
}

しかし、これは単なる通過テストです。私の実際のジオメトリ シェーダーでは、ワールド空間でいくつかの計算を行う必要がありますが、ジオメトリ シェーダー ポイントはビュー空間にあります。私の質問は: 4.1 ジオメトリ シェーダー内の gl_ModelViewProjectionMatrix にアクセスできますか? 従来のマトリックス スタックが glsl 4.1 で廃止され、一様な変数が使用されていることは理解していますが、アプリケーションを変更することはできません。lines_adjacency 入力タイプが必要なため、ジオメトリ シェーダーで glsl 1.2 を使用できません。マトリックスをプラグインの C++ ソースの均一変数にコピーする必要がありますか? それとも、gsl 4.1 から直接アクセスするための「裏口」がありますか? それとも私が考えていない何か他のものですか?

4

1 に答える 1

8

次のように言うことで、互換モードを使用できます(GL実装でサポートされている場合)。

#version 410 compatibility

シェーダーで。これにより、廃止されたすべてのグローバルユニフォーム状態が再び有効になります(特に)

于 2012-04-04T17:05:46.550 に答える