Pergunta

Aqui estão minhas configurações para opengl, caso sejam importantes:

glViewport(0,0,w,h); //w=800, h=600
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

Por um tempo, pensei que os planos de recorte se aplicariam a qualquer coisa para a qual gl_Position.z está fora de -1 para 1. Mas mesmo quando eu forço gl_Position.z a um número constante no shader:

gl_Position.z = -0.01;

Ainda há buffer z e recorte corretos com base em gl_Position.w!Então, quais são as regras?

Foi útil?

Solução

O valor de gl_Position está no que o OpenGL chama de "espaço do clipe". É um sistema de coordenadas homogêneo . Em particular, as extensões XYZ do espaço do clipe são [-W, + W]. Portanto, cada vértice está em seu próprio espaço de clipe.

Não sei exatamente o que você quer dizer com "quais são as regras". O espaço de clipe gl_Position é recortado contra a área de visualização em um espaço homogêneo. Portanto, eles são recortados na região [-W, + W] para cada vértice. É difícil imaginar isso em um espaço homogêneo projetivo, mas a matemática funciona, então não importa.

Depois disso, os vértices cortados são transformados em espaço de coordenada de dispositivo normalizado (NDC). Isso significa dividir o XYZ do espaço do clipe por W. Todos esses vértices estão no intervalo [-1, 1].

A partir daí, ocorre a transformação da janela de visualização. Os parâmetros glViewport escalam os vértices do espaço [-1, 1] NDC para a região da janela de visualização. Isso transforma pontos em espaço da janela; é no espaço da janela que eles são rasterizados.

O XY do espaço da janela é controlado por glViewport. Os valores Z para o espaço da janela são controlados por glDepthRange. O intervalo de profundidade padrão é um valor próximo de 0 e um valor distante de 1 (AVISO: a matriz de perspectiva dos planos próximos / distantes não tem nada em comum com o intervalo de profundidade. Não confunda os dois). Portanto, ele mapeia o [-1, 1] do Z no espaço NDC para [próximo, distante] no espaço da janela.

Essas são "as regras".

Outras dicas

Você usa glClearDepth (1.0f); glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL);

Depth Buffer tem um valor entre 0 e 1 (profundidade máxima), use GL_LEQUAL, o que significa que tudo seria desenhado na tela, pois o valor de profundidade seria menor ou igual a 1.

Para obter mais informações, visite: http://www.zeuscmd.com/tutorials/opengl/11-Depth.php

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