Pergunta

Não tenho certeza se posso fazer o que quero aqui, mas tenho um monte de objetos sendo renderizados no OpenGL (usando JOGL). Para um grupo de objetos, quero garantir que certos objetos nesse grupo sejam renderizados na frente de outros objetos nesse grupo. Eu tentei limpar o bit de buffer de profundidade e renderizar os objetos "frontal" por último, e isso funciona, exceto que isso atrapalha outro buffer de profundidade na tela.

O que se resume é que tenho uma lista de objetos sendo renderizados e quero garantir que certos objetos nessa lista sejam renderizados na frente de outros objetos (eles estão todos na mesma coordenada Z). Existe uma maneira de fazer isso?

Obrigado, Jeff

Foi útil?

Solução

Esta é uma técnica muito comum para desenhar objetos transparentes (objetos que possuem peças com alfa! = 1).

A abordagem mais comum é primeiro construir uma árvore de objetos a serem desenhados que você pode classificar até a "profundidade" depois de passar pelas matrizes da câmera de projeção*. Basicamente, em vez de apenas jogar triângulos cegos na GPU, você envia seus objetos um por um enquanto os processam no mundo para um buffer temporário. Esses objetos têm conhecimento total de cada triângulo e todos os shader/textura de cor/vértice shader/textura+ID etc., você pode classificar seu buffer (ingenuamente, objeto por objeto ou uma classificação completa com base em patches semelhantes em objetos).

O truque do GlDePthMask, se bem me lembro, vai algo assim:

glDepthMask(true);
drawOpaqueObjects();
glDepthMask(false);
drawTransparentObjects();

Para obter melhores resultados, os objetos transparentes são classificados de volta à frente, mas na maioria dos aplicativos (simples) isso não importa.

Editar: Observe que, para a 2ª técnica, enquanto você habilita e desative a escrita do buffer de profundidade, você ainda usa testes de buffer de profundidade, para que objetos transparentes por trás de seus objetos normais (um capacete apontando "para" a tela, por exemplo) não serão desenhados .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top