Come calcolare gl_FragCoord in GLSL
-
18-09-2019 - |
Domanda
Ok, a mio GLSL frammento di shader voglio essere in grado di calcolare la distanza del frammento da una particolare linea nello spazio.
Il risultato di questo è che sto cercando di usare prima un vec2 variabile impostata nel mio vertex shader di rispecchiare ciò che finisce in gl_FragCoord
:
varying vec2 fake_frag_coord;
//in vertex shader:
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
fake_frag_coord=(gl_ModelViewProjectionMatrix * gl_Vertex).xy;
Ora nello shader frammento mi aspetto:
gl_FragCoord.xy==fake_frag_coord
Ma non è così. Che operazione fa il gasdotto fare sul gl_Position
per trasformarlo in gl_FragCoord
che sto trascurando di fare sul fake_frag_coord
?
Soluzione
gl_FragCoord è coordinate dello schermo, in modo che ci si bisogno di avere informazioni circa la dimensione dello schermo e tale da produrre in base alla posizione. Il fake_frag_coord aver prodotto corrisponderà ad un punto nello schermo dispositivo normalizzato coordinate Credo (-1 a 1). Quindi, se si dovesse moltiplicare per la metà dimensioni dello schermo in una dimensione particolare e quindi aggiungere tale dimensione, si otterrebbe pixel dello schermo attuali.
Altri suggerimenti
Il problema che ho è che gl_ModelViewProjectionMatrix * gl_Vertex calcolato in uno shader non è sempre quello che i rendimenti di pipeline funzione fissi. Per ottenere risultati identici, do fake_frag_coord = ftransform ().
Modifica:
E poi scalare con i tuoi dimensioni dello schermo.
Vorrei avere più rep così ho potuto pignoli troppo. Ecco quello che so. OpenGL esegue la divisione per W automaticamente per voi, così da tempo una posizione arriva in uno shader frammento, è già in coordinate NDC, e da allora W sarà 1.0, l'unica volta che è necessario dividere per W è se vuole fare lo stesso per la matematica sul lato CPU, e ottenere gli stessi risultati, o, se per qualche strana ragione, voleva ottenere le coordinate NDC all'interno vertex shader.
varying vec2 fake_frag_coord;
//in vertex shader:
fake_frag_coord=(gl_ModelViewMatrix * gl_Vertex).xy