2012-11-29 4 views
10

GLSLシェーダでの参照渡しはどのようにして行いますか?あなたは関数シグニチャにinoutとして属性をマークすることができ、そしてそれは属性が効果的に例えばGLSLシェーダで参照によってマトリックスを渡すことはできますか?

を「参照渡し」になります

+1

「参照することにより、」ここで何を意味するのでしょうか? "共有オブジェクトへの将来の変更がシェーダに影響するようにコピーを作成せずに"渡すという目標はありますか? –

+0

素晴らしいコメント。私が意味するのは、C++や他のプログラミング言語の意味です。渡されたパラメータのローカルコピーは作成されません。 – bobobobo

答えて

13

、ここで

void doSomething(vec3 trans, inout mat4 mat) 

matは「参照渡し」されます、transが値渡しされます。

mat(すなわち均一でない属性)書き込み可能でなければなりません

+0

複合型の要素/スウィズルに 'inout'を使用することはできますか?例えば'void swap(inout float a、inout float b); vec3 foo、bar; swap(foo.x、bar.x) ' – AkiRoss

+3

これは嘘です。 "inout"関数のパラメータ修飾子は、データの2つの "ディープコピー"になります。ドキュメントを読む。 https://www.opengl.org/wiki/Core_Language_(GLSL)#Functions glslで真の「参照」を取得する方法は1つしかありませんが、これはこの拡張子で許可されています: https:/ /www.opengl.org/registry/specs/NV/shader_buffer_load.txt – Crabonog

+1

今後、この回答に出くわした人には、**完全に間違っています**。 GLSLは、関数のパラメータが "フードの下で"どのように渡されるかを制御することはできません。代わりに、コンパイラは**すべての**を決定し、実際には通常は実際にコピーしません(うまくいけば)。詳細については、[この回答](https://stackoverflow.com/a/28577878)を参照してください。 – user69513