Can you pass a matrix by reference in a GLSL shader?
如何在GLSL着色器中通过引用传递?
- "引用"在这里是什么意思?是否要通过"不进行复制,以便将来对共享对象进行的更改会影响着色器"的目标?
-
很棒的评论。我的意思恰恰是C或任何其他编程语言中的含义-不会对传递的参数进行本地复制。
您可以在函数签名中将属性标记为inout,这将使该属性有效地"按引用传递"
例如,
1
| void doSomething( vec3 trans, inout mat4 mat ) |
此处mat被"通过引用传递",trans被值传递。
mat必须是可写的(即不是统一属性)
- 是否可以在复合类型的元素/特征上使用inout?例如void swap(inout float a, inout float b); vec3 foo, bar; swap(foo.x, bar.x)
-
这是一个谎言。" inout"功能参数限定符将导致数据的两个"深层副本"。阅读文档。 opengl.org/wiki/Core_Language_(GLSL)#Functions如我所见,只有一种方法可以在glsl中获得真正的"引用",而该扩展名允许这样做:opengl.org/registry/specs/NV/shader_buffer_load。 TXT
-
对于将来遇到此问题的任何人,它都是完全错误的。 GLSL不能控制如何"在幕后"传递函数参数。相反,编译器将决定所有事情,并且(希望)通常不会实际复制任何东西。有关更多详细信息,请参见此答案。
-
我相信对于一个结构,您必须通过inout
默认情况下,所有参数均为"按值传递"。您可以使用以下"参数限定符"更改此行为:
in:"按值传递";如果在函数中更改了参数的值,则调用语句中的实际参数不变。
out:"通过引用";调用函数时参数未初始化;参数值的任何更改都会更改调用语句中的实际参数。
inout:参数值由调用语句初始化,并且函数所做的任何更改都会更改调用语句中的实际参数。
因此,如果您不想复制,则应使用out