Il pacchetto GLSL galleggia in una trama RGBA


8

Voglio comporre modelli e particelle convenzionali basati su triangoli con una scena ray tracing a un frame rate ragionevole.

webGL non ti consente di scrivere gl_FragDepthnel framment shader. Non è possibile avere più destinazioni di rendering, ma è possibile eseguire il rendering su una trama RGBA e quindi utilizzare quella trama come input per un'altra finestra di disegno. In questo modo posso rendere la mia scena ray tracing e memorizzare la profondità come input per la fase successiva. Questo è ovviamente tutt'altro che ideale, ma praticabile.

Mi piacerebbe sbagliarmi su questo, e questo è raccolto da tentativi ed errori piuttosto che da qualsiasi fonte definitiva; correggere eventuali assunzioni errate

Come è possibile impacchettare / decomprimere un float e, idealmente, alcuni bit di flag e simili, in una trama RGBA in modo efficiente in uno shader di frammenti GLSL?


2
C'è un vecchio articolo nel primo libro Gemme GPU sulla mappatura delle ombre (puoi leggerlo qui: http.developer.nvidia.com/GPUGems/gpugems_ch12.html ). Spiega come impacchettare i float in una trama RGBA in due modi diversi. Guarda la sezione 12.3.3 per la scrittura, quindi 12.3.6 per la lettura.
Benlitz,

1
Un'altra risorsa che potrebbe essere utile è l'articolo "Compact Normal Storage for Small G-Buffers" di Aras P di Unity ( aras-p.info/texts/CompactNormalStorage.html ). Questo articolo è limitato alle sole normali.
Mortennobel,

1
Puoi creare una trama R32F e scrivere semplicemente i tuoi valori di profondità lì. senza alcun imballaggio disimballaggio. quindi durante il tuo secondo passaggio "convenzionale a base triangolare" usa questa trama come buffer di profondità (collegato come profondità all'FBO). Sentiti libero di chiedere di più se questo non è chiaro.
Alariq,

@alariq sì, l'estensione float è ora ampiamente supportata.
Sarà il

@Will Se l'estensione float ha risolto il tuo problema, pubblicalo come risposta e accettalo.
Polar,

Risposte:


5

Qui ci sono le funzioni pack e unpack che funzioneranno su WebGL e OpenGL ES 2.0, questo è solo per valori nell'intervallo 0 ... 1, quindi dovresti fare attenzione che il calcolo della profondità sia nello spazio corretto.

La codifica galleggia su RGBA


Puoi aggiungere gli snippet di codice alla tua risposta? Se il sito che hai citato fallisce, il link non funzionerà.
Felipe Gutierrez,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.