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

15

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


1
这里的“按引用传递”是什么意思?目标是“不进行复制传递,以便将来对共享对象的更改会影响着色器”吗? - user166390
很好的评论。我的意思是在C++或任何其他编程语言中完全一样 -- 不会创建传递参数的本地副本。 - bobobobo
2个回答

14

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

例如,

void doSomething( vec3 trans, inout mat4 mat )

在这里mat是“按引用传递”的,trans是按值传递的。

mat必须可写(即不是一个均匀属性)


1
能否在复合类型的元素/切片上使用 inout?例如:void swap(inout float a, inout float b); vec3 foo, bar; swap(foo.x, bar.x) - AkiRoss
10
这是个谎言。在GLSL的"inout"函数参数限定符将导致你的数据被复制两次。请阅读文档。https://www.opengl.org/wiki/Core_Language_(GLSL)#Functions 据我所见,GLSL中只有一种方法可以获得真正的“引用”,而这是通过此扩展允许的:https://www.opengl.org/registry/specs/NV/shader_buffer_load.txt - Crabonog
11
未来任何看到这篇答案的人,请注意:这个答案是完全错误的。GLSL无法控制函数参数在“内部”如何传递。相反,编译器会决定所有内容,并且通常不会实际复制东西。有关更多详细信息,请参见此答案。 - AnOccasionalCashew
我认为对于结构体,你必须作为 inout 传递。 - Aditya Singh Rathore

2
所有参数默认都是“按值传递”的。您可以使用以下“参数限定符”更改此行为:
in:按值传递;如果在函数中更改了参数的值,则来自调用语句的实际参数不会改变。
out:按引用传递;在调用函数时,该参数未初始化;对参数值进行的任何更改都会更改来自调用语句的实际参数。
inout:参数的值由调用语句初始化,函数所做的任何更改都会更改来自调用语句的实际参数。
因此,如果您不想制作副本,则应使用 out

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接