2017-01-28 5 views
0

대상 : OpenGL을 ES 3.0계정 깊이를 고려하여 선별 FBO 렌더링

내 기본 프레임 버퍼 (화면) 이미 렌더링 내 장면의 일부가 포함되어 있다고 가정하자; 그것의 색깔과 깊이 버퍼는 유효한 데이터를 포함한다.

이제 중간 FBO 'fbo1'에 이미 렌더링 된 장면의 다른 부분이 있다고 가정합니다. 그 색상 데이터는 fbo1.COLOR0 첨부 파일에 첨부 된 'mColor'텍스처로 유지되며 깊이는 다른 FBO 'fbo2'의 DEPTH 첨부 파일에 첨부 된 다른 텍스처 'mDepth'에 보관됩니다.

이제 mColor를 사용하여 mDepth의 깊이를 고려하여 mColor를 화면에 렌더링하고 싶습니다. 색상 데이터 만 들어있는 텍스처를 화면에 렌더링하는 방법은 알고 있지만, mDepth를 고려하여 어떻게해야할지 모르겠다.

본질적으로 mColor로 텍스처링 된 쿼드를 화면에 렌더링 할 때 화면의 깊이 버퍼를 쿼드의 깊이가 아니라 mDepth의 깊이와 비교해야합니다. 그렇게하는 방법?

답변

1

파이프 라인을 분할하고 FBO0을 여러 개의 패스로 렌더링 할 때 화면에 표시되지 않는 간단한 대답은 "잘못하고 있습니다"입니다.

특히 타일 기반 아키텍처를 사용하는 모바일에서 GPU가 매우 비효율적 인 중간 상태를 작성하고 다시 읽도록해야합니다.

각 오프 스크린 패스를 먼저 렌더링 한 다음 윈도우 패스 (FBO0)를 단일 패스로 렌더링합니다.

화면의 깊이 버퍼를 쿼드의 깊이가 아닌 mDepth의 깊이와 비교해야합니다. 그렇게하는 방법?

깊이 텍스처에서 깊이 값을로드하고 조각 쉐이더에서이 값을 gl_FragDepth에 할당합니다. 그러나 이렇게하면 모든 조각을 늦은 zs 깊이로 강제 업데이트합니다. 조각을 유지해야하는지 결정하기 전에 쉐이더를 실행해야하므로 초기 z에서 실제 삼각형 z 값을 사용하는 것과 비교하면 무섭습니다. 아닙니다. 그래서, 위와 같이 렌더링 파이프 라인을 다시 설계하여이 작업을 수행 할 필요가 없도록 제안합니다.

+0

나는 본다. 내가 실제로하고있는 일은 다음과 같습니다. 우선 대부분의 장면을 렌더링합니다. 그런 다음 N 패스에서 일부 포스트 프로세싱을 필요로하는 각 객체를 오프 스크린 버퍼로 렌더링합니다. 객체가 화면에서 끝나는 위치를 계산합니다 (메쉬가 아주 간단합니다). FBO로 렌더링 한 다음 객체에 사후 처리를 적용한 다음 질문에 설명 된 문제에 직면합니다. 이것을 화면에 병합합니다. 개체별로 사후 처리하는 것이 더 간단 할 것이라고 생각했습니다. 예를 들어 개체를 BLUR로 처리하면 BLUR에 더 가까이있는 개체가 들어오는 것을 걱정할 필요가 없기 때문입니다. – Leszek

+0

블러는 자연스럽게 "퍼지 에지"의 일부 형태를 암시합니다. 즉, 절반 정도의 포인트입니다. 따라서 어떤 시점에서는 어쨌든 "크립 현상"을 해결해야 할 것입니다. 파이프 라인의 후반부에 통증을 미루는 것뿐입니다. – solidpixel

+0

아니요, 귀하의 제안을 구현했으며 완벽하게 작동합니다. 즉, 흐리고 흐려지지 않은 물체가 부분적으로 멀리있는 물체를 가리고 있으면 가까이있는 물체가 완벽하게 선명하게 유지됩니다. 객체마다 포스트 프로세싱없이이 효과를 얻으려면 (즉, 전체 장면을 한 번에 후 처리해야하는 경우) 스텐실을 사용하여 추가 객체를 표시 한 다음 스텐실 테스트로 흐림 효과를 적용해야하지만 DEPTH (더 가까운 물체와 경계선 가까이에있는 다른 물체의 픽셀은 가까운 물체의 픽셀에 영향을받지 않습니다!). – Leszek

1

FBO의 깊이를 텍스처로 사용할 수 있습니다. FBO의 내용을 그릴 때 색상 패스를 그리고 FBO의 깊이 텍스처에서 gl_FragDepth를 수동으로 작성합니다. 그 후에 적절한 깊이 테스트를 사용하여 다른 모든 장면 컨텐츠를 그릴 수 있습니다.

+0

음 ... 이해가 안됩니다. 물론, 화면에 mColor로 텍스처링 된 쿼드를 렌더링 할 때, 내 조각 쉐이더에서 gl_FragDepth에 쓸 수 있고 'mDepth'의 내용으로 설정할 수 있습니다.하지만 그다지 아무것도주지 않습니다. DEPTH 테스트는 이미 프래그먼트 쉐이더 이전에 실행되었으며 mDepth가 아닌 Quad의 4 개 코너의 선형 보간에서 얻은 Depth와 스크린의 깊이를 비교했습니다. 이게 문제 야. – Leszek