可以在GLSL着色器中通过引用传递矩阵吗?

可以在GLSL着色器中通过引用传递矩阵吗?,glsl,Glsl,如何在GLSL着色器中按引用传递?可以在函数签名中将属性标记为inout,这将使属性有效地“按引用传递” 比如说, void doSomething( vec3 trans, inout mat4 mat ) 这里的mat是“通过引用传递的”,trans是通过值传递的 mat必须是可写的(即非统一属性)默认情况下,所有参数都是“按值传递”。您可以使用以下“参数限定符”更改此行为: 在“传递值”中;如果在函数中更改了参数的值,则调用语句中的实际参数将保持不变 输出:“通过引用传递”;调用函数时参

如何在GLSL着色器中按引用传递?

可以在函数签名中将属性标记为
inout
,这将使属性有效地“按引用传递”

比如说,

void doSomething( vec3 trans, inout mat4 mat )
这里的
mat
是“通过引用传递的”,
trans
是通过值传递的


mat
必须是可写的(即非统一属性)

默认情况下,所有参数都是“按值传递”。您可以使用以下“参数限定符”更改此行为:

在“传递值”中;如果在函数中更改了参数的值,则调用语句中的实际参数将保持不变

输出:“通过引用传递”;调用函数时参数未初始化;参数值的任何更改都会更改调用语句中的实际参数

inout:参数的值由调用语句初始化,函数所做的任何更改都会更改调用语句中的实际参数


所以如果你不想复制,你应该使用
out

这里的“引用”是什么意思?目标是通过“不进行复制,以便将来对共享对象的更改将影响着色器”吗?很好的评论。我的意思是C++或任何其他编程语言中的含义——没有传递参数的本地副本。在复合类型的元素/喷嘴上使用<代码> IOUT < /CUT>是可能的吗?e、 g.
void swap(inout float a,inout float b);vec3富,巴;交换(foo.x,bar.x)
这是个谎言。“inout”函数参数限定符将生成数据的两个“深度副本”。阅读文档。正如我所看到的,只有一种方法可以在glsl中获得真正的“引用”,这是这个扩展所允许的:对于将来遇到这个答案的任何人来说,这是完全错误的。GLSL不会让您控制如何“在引擎盖下”传递函数参数。相反,编译器决定一切,并且(希望)通常不会真正复制东西。有关更多详细信息,请参阅。我认为对于结构,必须作为
inout传递