Como calcular gl_FragCoord em GLSL
-
18-09-2019 - |
Pergunta
Ok, na minha GLSL fragmento shader eu quero ser capaz de calcular a distância do fragmento a partir de uma linha particular no espaço.
O resultado disso é que eu estou primeiro tentando usar um conjunto vec2 variando em meu Vertex Shader para espelhar o que acaba em gl_FragCoord
:
varying vec2 fake_frag_coord;
//in vertex shader:
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
fake_frag_coord=(gl_ModelViewProjectionMatrix * gl_Vertex).xy;
Agora, no shader de fragmento I esperar:
gl_FragCoord.xy==fake_frag_coord
Mas isso não acontece. O funcionamento é que o pipeline de fazer no gl_Position
para transformá-lo em gl_FragCoord
que estou deixando de fazer no fake_frag_coord
?
Solução
gl_FragCoord é coordenadas de tela, então você precisa ter informações sobre o tamanho da tela e tal para produzi-lo com base na posição. O fake_frag_coord você produziu corresponderá a um ponto na tela em coordenadas do dispositivo normalizado Eu acho que (-1 a 1). Então, se você fosse para multiplicar por metade do tamanho da tela em uma dimensão particular, e, em seguida, adicionar esse tamanho, você terá pixels de tela real.
Outras dicas
O problema que você tem é que gl_ModelViewProjectionMatrix * gl_Vertex calculado em um shader não é sempre que os rendimentos de pipeline de função fixa. Para obter resultados idênticos, fazer fake_frag_coord = ftransform ().
Editar:
E, em seguida, escalá-lo com suas dimensões da tela.
Eu gostaria de ter mais rep para que eu pudesse procurar defeitos também. Aqui está o que eu sei. OpenGL realiza a divisão por W automaticamente para você, por isso, o tempo de uma posição chega em um shader de fragmento, ele já está em coordenadas NDC, e, em seguida, W será 1.0, a única vez que você precisa para dividir por W é se você quer fazer a mesma matemática no lado da CPU, e obter os mesmos resultados, OR, se por algum motivo estranho, queria obter coordenadas NDC dentro do seu shader de vértice.
varying vec2 fake_frag_coord;
//in vertex shader:
fake_frag_coord=(gl_ModelViewMatrix * gl_Vertex).xy