GLSLの関数で参照渡しをするときに、以下のように引数にout
やinout
といった修飾子を指定すると思います。
void func(out output) {
...
}
out
とinout
の違いを今までわかっていなかったのですが、以下のページに書いてあったので備忘録としてまとめておきます。
https://www.khronos.org/opengl/wiki/Core_Language_(GLSL)
まずinout
ですが、こちらin
修飾子と同じように関数の呼び出し時に実引数の値を引数にコピーします。例えば、以下のようなフラグメントシェーダーの場合、color
は最終的に(1.0, 1.0, 0.0)
となり、黄色でレンダリングされます。
void testInout(inout color) {
color += vec3(0.0, 1.0, 0.0);
}
vod main() {
vec3 color = vec3(1.0, 0.0, 0.0);
testInout(color);
gl_FragColor = vec4(color, 1.0);
}
一方でout
では関数の呼び出し時に値のコピーをおこないません。そのため値は未定義(値がなにか不明)の状態になります。以下のようなフラグメントシェーダーでは最終的なcolor
の値は予測できなくなります。実際に実行してみるとノイズのようなものが出力されることを確認できました。
http://glslsandbox.com/e#46725.0
void testOut(out color) {
color += vec3(0.0, 1.0, 0.0);
}
vod main() {
vec3 color = vec3(1.0, 0.0, 0.0);
testOut(color);
gl_FragColor = vec4(color, 1.0);
}