Quindi, ho un impostore (la geometria reale è un cubo, possibilmente ritagliato, e la geometria del filtro è una spugna di Menger) e ho bisogno di calcolarne la profondità.GLSL gl_FragCoord.z Calcolo e impostazione gl_FragDepth
Posso calcolare la quantità da compensare nello spazio mondiale abbastanza facilmente. Sfortunatamente, ho passato ore a non riuscire a perturbare la profondità con esso.
Gli unici risultati corretti posso ottenere sono quando vado:
gl_FragDepth = gl_FragCoord.z
Fondamentalmente, ho bisogno di sapere come gl_FragCoord.z è calcolato in modo che io possa:
- Prendere la trasformazione inversa da gl_FragCoord.z allo spazio degli occhi
- Aggiungere la profondità perturbazione
- Trasformare questa profondità perturbata nello stesso spazio dell'originale gl_FragCoord.z.
Mi scuso se sembra una domanda doppia; c'è un certo numero di altri post qui che affrontano cose simili. Tuttavia, dopo averli implementati tutti, nessuno funziona correttamente. Piuttosto che cercare di sceglierne uno per ottenere aiuto, a questo punto, sto chiedendo il codice completo che lo faccia. Dovrebbero essere solo poche righe.
Hai scritto anche un vertex shader? o solo un frammento shader? –
Non ti darò codice su principio generale, ma posso darti [questo link al Wiki OpenGL] (http://www.opengl.org/wiki/Compute_eye_space_from_window_space). Così come questo link ad un mio tutorial su [impostors e depth che mostra come fare anche questo] (http://www.arcsynthesis.org/gltut/Illumination/Tut13%20Deceit%20in%20Depth.html). Trasformare la profondità indietro è banale. –
Michael: sì, ma è solo un passaggio attraverso lo shader.Come succede, i calcoli sono fatti nello spazio mondiale, quindi posso calcolare lo spazio degli occhi nel programma frammento. Nicol, avevo già visto quella pagina. Lo implemento come: vec4 clip_pos = gl_ProjectionMatrix * vec4 (eye_pos, 1.0); float ndc_depth = clip_pos.z/clip_pos.w; gl_FragDepth = (((clip_far-clip_near) * ndc_depth) + clip_near + clip_far)/2.0; Sfortunatamente, la profondità sembra non rientrare nell'intervallo di profondità, anche se non c'è compensazione. Grazie, – imallett