Em vertex shaders OpenGL, que é w, e por que eu dividir por ele?
-
19-09-2019 - |
Pergunta
void main(void)
{
vec4 clipCoord = glModelViewProjectionmatrix * gl_Vertex;
gl_Position = clipCoord;
gl_FrontColor = gl_Color;
vec3 ndc = clipCoord.xyz / clipCoord.w;
Assim, o clipCoord
está apenas fazendo transforma oleodutos fixos padrão.
Por que eu dividir por w
, e o que eu ganho com isso?
Solução
W é o quarto de coordenadas de um vértice tridimensional; Este vértice é chamado vértice coordenadas homogêneas.
Em poucas palavras, o componente W é um factor que divide os outros componentes do vector. Quando W é de 1,0, as coordenadas dos vértices homogéneos são "normalizada". Para comparar dois vértices, você deve normalizar o valor W a 1,0.
Pense no vértice (1,1,1,1). Agora aumentar o valor W (w> 1,0). A posição normalizada é escalar! e ele está indo para a origem. Pense no vértice (1,1,1,1). Agora diminuir o valor W (W <1,0). A posição normalizada vai um ponto infinito.
Além de escalar coordenadas dos vértices, o W coordenada é necessária uma vez que você tem que multiplicar uma matriz 4x4 (a vista do modelo e / ou as matrizes de projeção) com uma matriz 4x1 (o vértice).
É claro que o Livro Vermelho é o guia definitivo: