2011-08-23 5 views
6

내가 틀렸다면 저를 시정하십시오. 버텍스 및 픽셀 쉐이더를 사용할 때 우리는 일반적으로 버텍스 쉐이더의 출력 gl_position을 계산하는 코드를 제공합니다. 그러면 픽셀 쉐이더에서 gl_FragCoord 입력을 가진 셀을 찾을 수 있습니다. OpenGL이 gl_position에서 gl_FragCoord를 계산하기 위해 수행하는 작업의 이름은 무엇입니까? 그것들이 "프로젝션"이고 "클립 좌표 변환"이라는 것이 맞습니까? 그런 다음 작업 중에 변형이 정확히 무엇을 수행합니까? 다른 말로하면, gl_FragCoord와 gl_position 사이의 수학적 관계는 무엇입니까? OpenGL 함수를 대체하는 데 사용할 수 있습니까?glsl에서 gl_position에서 gl_fragCoord를 계산하는 데 사용되는 공식은 무엇입니까?

감사합니다.

+0

나는 똑같은 문제와 질문을 오래 전에 가지고 있었고, "OpenGL : GLSL의 창 공간 좌표에서의 시선 좌표 계산"이라는 질문에 직접 답했습니다. 오른쪽 링크를 찾을 수 있습니다. – karx11erx

+0

죄송합니다 karx11erx, 이것은 내가 원하는 것이 아닙니다. 사실, 나는 내가 원하는 것이 그 반대라고 생각한다. "unproject"를하고 싶지 않습니다. 3D 좌표를 2D 좌표계에 투사하고 싶습니다. – wil

+0

셰이더가 처음에는 (밝은 뷰 공간에서) 프로젝트를 비 웁니다. 그리고 뷰어 화면 공간으로 투영하기 때문에 거기에서 작업하는 방법을 볼 수 있습니다. – karx11erx

답변

9

gl_Position은 사후 투영 동질 좌표에 있습니다.

gl_FragCoord가 단편의 (2D) 위치에있을 gl_Position하기, 의 정점 (4D) 위치에 있음이 주목할 가치가있다. 일어날

동작 사이 (즉 뷰 내부 모두에있는 다수의 삼각형으로 삼각형을 절단 (3 개 꼭지점에서 삼각형을 생성하는 예)

  • 클리핑

    1. 프리미티브 조립되어 그것은 처음
    2. 뷰포트 응용 프로그램)
    3. 래스터에 맞지 않으면 (그 삼각형을 그리고 그들로부터 커버 조각)
    을 생성

    따라서 뷰포트 인 2 차원 공간의 정점 위치에서 표현되는 임의의 점을 변형하는 수식을 찾을 수 있지만 생성 된 조각이 직접 뷰포트에 정렬되지 않으므로 유용하지 않습니다. 정점 위치. 정점의 2 차원 좌표를 구하는 공식은

    2d_coord_vertex = viewport.xy + viewport.wh * (1 + gl_Position.xy/gl_Position.w)/2 
    

    입니다. 다시 이것은 gl_FragCoord가 아닙니다. 보다 자세한 지식이 필요한 경우 GL 사양의 래스터 화에 대한 세부 정보를 확인하십시오.

    "OpenGL 함수 바꾸기"가 의미하는 바를 정확히 모르겠지만 래스터 라이 제이션은 너무 단순하지 않으며 SO 응답 범위를 벗어납니다.

  • +0

    답장을 보내 주셔서 감사합니다. 내 목적은 그림자 맵 조명 쉐이더를 구현하는 것이다. light의 위치 (light의 "projection matrix"를 사용)에서 장면을 렌더링하여 depth map (shadow map)을 만들었지 만 최종 장면의 vertex를 렌더링 할 때지도에서 그림자 데이터를 가져 오는 데 사용할 좌표를 모르겠습니다 . light의 "projection matrix"를 사용하여 그림자 맵을 만들 때 gl_position 값을 얻은 다음 그림자 맵을 만들 때 올바른 위치에 그림자 데이터를 가져 오는 gl_fragCoord 값을 계산할 수 있다고 생각했습니다. 작동 할 수 있습니까? – wil

    +0

    @wil : 이것을 수행하는 일반적인 방법은 gl_Position (다른 출력에 있음)과 함께 월드 또는 뷰 공간 위치를 프래그먼트 셰이더에 전달하는 것입니다. 그런 식으로 프래그먼트 셰이더에서 정확한 보간 위치 (통과 한 부분에 따라 뷰 또는 월드 공간에서)를 매트릭스로 변환하여 가벼운 공간으로 되돌릴 수 있습니다. 짧은 대답은 gl_FragCoord에 의존하지 말고 필요한 것을 전달하는 것입니다. – Bahbar

    +0

    당신이 뭘하고 있는지 확실하지 않지만 그림자 맵을 계산하는 것처럼 들리지는 않습니다. 그게 내가 언급 한 것이고, 당신 자신의 것과 크게 다른 것 같습니다. 새로운 질문을 열 것을 권하고 싶습니다. 문제를 해결하기 위해 노력하고 있습니다. – Bahbar

    관련 문제