2012-11-29 46 views
10

你如何在GLSL着色器中引用參考?您可以在GLSL着色器中通過引用傳遞矩陣嗎?

+1

什麼是「參照」的意思是在這裏嗎?目標是否「通過複製,以便將來更改 - 共享對象 - 會影響着色器」? – 2012-11-29 19:55:54

+0

偉大的評論。我的意思是在C++或任何其他編程語言中的含義 - __傳遞的參數的本地副本不作出___。 – bobobobo

回答

13

你可以標記爲inout在函數簽名的屬性,這將使該屬性有效

例如「按引用傳遞」,

void doSomething(vec3 trans, inout mat4 mat) 

這裏mat是「按引用傳遞」 ,trans是按值傳遞的。

mat必須是可寫的(即沒有一個統一的屬性)

+0

是否可以在複合類型的元素/ swizzles上使用'inout'?例如'void swap(inout float a,inout float b); vec3 foo,bar; swap(foo.x,bar.x)' – AkiRoss

+3

這是一個謊言。 「inout」函數參數限定符會導致數據的兩個「深度拷貝」。閱讀文檔。 https://www.opengl.org/wiki/Core_Language_(GLSL)#Functions 正如我所看到的,只有一種方法可以在glsl中獲得真正的「引用」,並且這是由此擴展所允許的: https:/ /www.opengl.org/registry/specs/NV/shader_buffer_load.txt – Crabonog

+1

對於任何人在未來遇到這個答案,**這是完全錯誤**。 GLSL不允許您控制函數參數如何在「引擎蓋下」傳遞。相反,編譯器決定**所有**,並且(希望)通常不會實際複製東西。有關更多詳細信息,請參閱[此答案](https://stackoverflow.com/a/28577878)。 – user69513