2016-05-20 3 views
2

と暗黙的にサイズのアレイIはGLSL 4.0コアジオメトリシェーダで、次のコード・セグメントを有すること:GLSL:アクセス関数パラメータ

void pushVertex(const int i) 
{ 
    gl_Position = gl_in[i].gl_Position; 
    // Some other stuff 
    EmitVertex(); 
} 

後、私は基本的にそうでpushVertex(0); pushVertex(1);を呼び出して。

これは実際にNvidiaドライバを搭載したWindows上で動作しますが、MaxOSXは暗黙的にサイズの指定された配列に間接的なインデックスを投げます。回避策に関するアイデアはありますか?

答えて

1

基本的には、この関数をインライン化してインデックスが定数になり、間接インデックスが不要になるようにGLSLコンパイラに納得させる必要があります。コンパイラは明らかにあなたのためにそれをしないので、あなたは、マクロとしてpushVertexを定義してみてください:もちろん

#define pushVertex(I) if(1) {    \ 
    gl_Position = gl_in[I].gl_Position; \ 
    /* other stuff */      \ 
    EmitVertex();       \ 
} else 

、コンパイラがインライン化できないほど弱い場合、それはとのトラブルを持っていることマクロ。

+0

私はそれをマクロで解決しました。 GLSLがCプリプロセッサの範囲でマクロをサポートしていることは、実際にはわかりませんでした。あなたは後に 'else'を削除したいかもしれません。 – Marius

+0

末尾の 'else'は、マクロの使用後に'; 'を吸収するためにそこにあります... –

+0

ああ大丈夫ですが、elseがなければ動作しませんか?中括弧で囲まれていないとうまくいきませんか? – Marius