2012-11-29 10 views
10

Come si passa da riferimento in uno shader GLSL?È possibile passare una matrice per riferimento in uno shader GLSL?

+1

Che cosa significa "per riferimento" significa qui? L'obiettivo è di passare "senza fare una copia in modo che le modifiche future - all'oggetto condiviso - influenzino lo shader"? –

+0

Grande commento. Quello che intendo è esattamente il significato in C++ o in qualsiasi altro linguaggio di programmazione - __a una copia locale del parametro passato non è stata creata__. – bobobobo

risposta

13

È possibile contrassegnare un attributo come inout nella firma funzione e che renderà l'attributo in modo efficace "pass per riferimento"

Per esempio,

void doSomething(vec3 trans, inout mat4 mat) 

Qui mat è "passati per riferimento" , trans viene passato per valore.

mat deve essere scrivibile (cioè non un attributo omogeneo)

+0

È possibile utilizzare 'inout' su elementi/swizzles di tipi composti? per esempio. 'void swap (inout float a, inout float b); vec3 foo, bar; swap (foo.x, bar.x) ' – AkiRoss

+3

È una bugia. Il qualificatore del parametro di funzione "inout" genererà due "copie profonde" dei tuoi dati. Leggi la documentazione https://www.opengl.org/wiki/Core_Language_(GLSL)#Functions Come posso vedere c'è solo un modo per ottenere veri "riferimenti" in glsl, e questo è permesso da questa estensione: https://www.opengl.org/registry/specs/NV/shader_buffer_load.txt – Crabonog

+1

Per chiunque imbattersi in questa risposta, in futuro, ** IT è completamente sbagliato **. GLSL non ti dà il controllo su come i parametri delle funzioni vengono passati "sotto il cofano". Invece, il compilatore decide ** tutto **, e (si spera) non copierà di fatto le cose in genere. Vedi [questa risposta] (https://stackoverflow.com/a/28577878) per maggiori dettagli. – user69513

Problemi correlati