2012-04-04 27 views
5

"クローズソース"アプリケーション内で実行されるプラグインの一部としてglslシェーダプログラムで作業しています。アプリケーション(maya)はOpenGL 2.1を使用して書かれていますが、私たちのグラフィックスカードはOpenGL/glsl 4.1をサポートしています。私のプログラムではテッセレーションとジオメトリシェーダを使いたいです。アプリケーションは、OpenGLビューポートと従来のモデル/ビューマトリックススタックを設定し、私はコードのその部分を制御できません。gl_ModelViewProjectionMatrixを使用したGLSL 4.1

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

// GLSL VERTEX SHADER 
#version 120 

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

マイパススルーgeomeryシェーダは、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++ソースの一様変数に行列をコピーする必要がありますか?または、glsl 4.1から直接取得するための「バックドア」はありますか?それとも私が考えていない何か?

答えて

7

(あなたのGLの実装がサポートしている場合)あなたは言って互換モードを使用することができます。

#version 410 compatibility 

シェーダで。これにより、廃止予定のグローバルな統一状態がすべて復活します(とりわけ)

関連する問題