Eu tenho um renderbuffer (DepthStencil) em um FBO e preciso obter uma textura dele. Parece que não posso ter uma textura DepthComponent e um depthStencil no FBO, por isso preciso de alguma maneira de converter o bufferbase em uma textura DepthComponent depois de terminar o uso para usá-lo posteriormente no pipeline.
Tentei várias técnicas para pegar o componente de profundidade do renderbuffer por semanas, mas sempre saio com lixo. Tudo o que quero no final é a mesma textura que receberia de um FBO se não estivesse usando um buffer de renderização. Alguém pode postar algumas instruções abrangentes ou código que cubra essa operação aparentemente simples?
EDITAR:
Linky para uma versão extraída do código http://dl.dropbox.com/u/9279501/fbo.cs
Screeny do efeito Profundidade de Campo + FBO - sem profundidade (!) Http://i.stack.imgur.com/Hj9Oe.jpg
Screeny sem efeito de profundidade de campo + FBO - profundidade funcionando bem http://i.stack.imgur.com/boOm1.jpg
O que você está perguntando é possível no OpenGL 3.2. Eu tenho meu FBO exibindo cores difusas em uma textura de cor, normais em outra textura de cor e profundidade em uma textura de profundidade - não são necessários amortecedores de renderização. De fato, os buffers de renderização são apenas um problema, porque você não pode obter amostras deles; portanto, você teria que usar
glReadPixels(...)
ou copiar de alguma forma os dados da RBO para uma textura na CPU, em vez de apenas manter tudo na memória da GPU. Então...Se você realmente quiser, pode escrever um código no seu sombreador de primeira passagem para enviar manualmente coisas como profundidade, para um anexo de textura de cor separado no seu FBO. Isso seria para você usar em seus shaders pós-passe. Para o uso do OpenGL em seus testes internos de profundidade, você precisaria adicionalmente de uma RBO ou textura definida como GL_DEPTH_ATTACHMENT do seu FBO. Mas você pode configurar uma única textura para servir a ambos - isso é mais eficiente e fácil de usar.
Meu código de configuração de textura de profundidade se parece com isso (Java, apenas ignore o material ByteBuffer ... e observe que eu uso "id" para me referir a identificadores / ponteiros inteiros, já que esse conceito realmente não se encaixa bem em Java):
E depois:
Agora você pode passar
gBufferDepthTexture
(ou o que você tem) como um uniforme para o seu segundo e terceiro pass shaders de fragmento. Acho que podemos assumir com segurança que você pode fazer exatamente a mesma coisa com o buffer de estêncil.fonte
Você deve conseguir criar uma textura (em vez de um RenderBuffer) usando o formato GL_DEPTH_STENCIL. Não tenho certeza do processo exato para usar a profundidade de tal textura em um programa de sombreador (que suponho que você esteja usando, já que usa FBOs), mas a especificação do OpenGL deve especificar quais canais de cores obtêm quais valores ( meu palpite seria que R, G e B são todos ajustados à profundidade e A é definido como estêncil).
Atualmente, tenho como alvo o OpenGL 3.2, portanto, talvez seja necessário verificar se o formato da textura é viável para você. Nunca me lembro quais versões introduzem recursos diferentes.
fonte