O pacote GLSL flutua em uma textura RGBA


8

Quero compor modelos e partículas convencionais baseados em triângulo com uma cena traçada por raios a uma taxa de quadros razoável.

O webGL não permite escrever o gl_FragDepthsombreador no fragmento. Você não pode ter vários destinos de renderização, mas pode renderizar em uma textura RGBA e, em seguida, usar essa textura como entrada para outro draw-op. Para que eu possa renderizar minha cena traçada por raios e armazenar a profundidade como entrada para o próximo estágio. Obviamente, isso está longe de ser o ideal, mas viável.

Eu adoraria estar errado sobre isso, e isso é coletado por tentativa e erro, e não por qualquer fonte definitiva; corrija quaisquer suposições defeituosas

Como você pode empacotar / descompactar um float e, idealmente, alguns bits de flag e tal, em uma textura RGBA eficientemente em um shader de fragmento GLSL?


2
Há um artigo antigo no primeiro livro GPU Gems sobre mapeamento de sombra (você pode lê-lo aqui: http.developer.nvidia.com/GPUGems/gpugems_ch12.html ). Ele explica como compactar carros alegóricos em uma textura RGBA de duas maneiras diferentes. Veja a seção 12.3.3 para escrever e, em seguida, 12.3.6 para ler.
Benlitz 11/08/12

11
Outro recurso que pode ser útil é o artigo "Armazenamento normal compacto para pequenos buffers G", de Aras P, do Unity ( aras-p.info/texts/CompactNormalStorage.html ). Este artigo está limitado apenas aos normais.
Mortennobel 11/08/2012

11
Você pode criar uma textura R32F e apenas escrever seus valores de profundidade lá. sem qualquer embalagem desembalar. depois, durante o seu segundo passe "convencional com base em triângulo", use essa textura como um buffer de profundidade (anexado como profundidade ao FBO). Fique à vontade para perguntar mais se isso não estiver claro.
Alariq

@alariq sim, a extensão float é amplamente suportada agora.
Will

@ Will Se a extensão float resolveu o seu problema, publique-a como resposta e aceite-a.
Polar

Respostas:


5

Aqui estão as funções de empacotamento e descompactação que funcionarão no WebGL e OpenGL ES 2.0; isso é apenas para valores no intervalo 0 ... 1, portanto, você deve ter cuidado para que o cálculo da profundidade esteja no espaço correto.

Codificação de flutuadores para RGBA


Você pode adicionar os trechos de código à sua resposta? Se o site que você mencionou for desativado, o link não servirá para nada.
Felipe Gutierrez
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.