GLSL에서 GL_FRAGCOORD를 계산하는 방법
-
18-09-2019 - |
문제
좋아, 내 GLSL 조각 셰이더에서 나는 공간의 특정 선에서 조각의 거리를 계산할 수 있기를 원한다.
이것의 결과는 처음으로 내 정점 셰이더에 다양한 VEC2를 사용하여 gl_FragCoord
:
varying vec2 fake_frag_coord;
//in vertex shader:
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
fake_frag_coord=(gl_ModelViewProjectionMatrix * gl_Vertex).xy;
이제 조각 셰이더에서 다음을 기대합니다.
gl_FragCoord.xy==fake_frag_coord
그러나 그렇지 않습니다. 파이프 라인은 어떤 작업을 수행합니까? gl_Position
그것을 바꾸려면 gl_FragCoord
내가 할 일을 소홀히하고있다 fake_frag_coord
?
해결책
GL_FRAGCOORD는 화면 좌표이므로 화면 크기에 대한 정보가 있어야합니다. 당신이 생성 한 가짜_frag_coord는 내가 생각하는 정규화 된 장치 좌표 (-1 ~ 1)의 화면의 점에 해당합니다. 따라서 특정 차원에서 화면 크기의 절반을 곱한 다음 해당 크기를 추가하면 실제 화면 픽셀이 나타납니다.
다른 팁
당신이 가진 문제는 셰이더로 계산 된 GL_MODELVIEWPROEDINGTAMIX * GL_VERTEX가 항상 고정 된 기능 파이프 라인이 생성하는 것은 아니라는 것입니다. 동일한 결과를 얻으려면 fake_frag_coord = ftransform ()을 수행하십시오.
편집하다:
그런 다음 화면 치수로 확장하십시오.
나는 더 많은 담당자가 있었으면 좋겠다. 여기 내가 아는 것입니다. OpenGL은 귀하를 위해 자동으로 Divide-By-W를 수행하므로 Position이 Fragment Shad CPU 측에서 동일한 수학을하고 동일한 결과를 얻고 싶거나 이상한 이유가 있다면 Vertex 셰이더 내에서 NDC 좌표를 받고 싶었습니다.
varying vec2 fake_frag_coord;
//in vertex shader:
fake_frag_coord=(gl_ModelViewMatrix * gl_Vertex).xy