2010-12-26 4 views
6

설명 된 기술을 구현하려고합니다 : Compositing Images with Depth.깊이 버퍼에 텍스처 데이터 쓰기

아이디어는 기본적으로 가짜 3D로 (이미지에서로드 된) 기존의 텍스처를 깊이 마스크로 사용하는 것입니다.

제가 직면 한 문제는 glDrawPixels를 OpenglES에서 사용할 수 없다는 것입니다. iPhone에서 동일한 작업을 수행 할 수있는 방법이 있습니까?

답변

7

깊이 버퍼는 OpenGL ES에서 생각하는 것보다 더 잘 보이지 않습니다. glDrawPixels가 없어도 gl_FragDepth가 GLSL에서 제거되었습니다. 따라서 색상을 푸시 할 때 깊이 버퍼에 값을 스풀링하는 사용자 정의 조각 쉐이더를 작성할 수 없습니다.

가장 확실한 해결책은 텍스처에 깊이 정보를 저장하고 생성하는 조각과 사용자가 제공 한 텍스처에서 찾은 조각 사이의 깊이 비교를 수행하는 사용자 지정 조각 쉐이더를 사용하는 것입니다. 생성 된 프래그먼트가 더 가까운 경우에만 진행할 수 있습니다. 일반 깊이 버퍼는 다른 오 클루 젼 사례를 잡을 것이고 원칙적으로 프레임 버퍼 객체를 사용하여 처음에는 깊이 텍스처를 생성하여 GPU를 이용한 완전한 왕복 여행을 제공 할 수 있습니다. 문제.

단점은 드로잉이 추가 텍스처 단위를 필요로하고 텍스처가 정수 구성 요소를 사용한다는 것입니다.

EDIT : 예제를 단순하게 유지하기 위해 모든 깊이 정보를 텍스처의 빨간색 채널로 채우고 있다고 가정합니다. 즉, 당신에게 정말 낮은 정밀 깊이 버퍼를주고 싶지만, 단지 명확하게하기 위해, 당신은 같은 빠른 조각 쉐이더를 작성할 수

void main() 
{ 
    // write a value to the depth map 
    gl_FragColor = vec4(gl_FragCoord.w, 0.0, 0.0, 1.0); 
} 

빨강 채널에 저장 깊이에. 따라서 오래된 깊이 텍스처 확장을 부분적으로 다시 만들었습니다. 픽셀이 더 밝은 빨간색이 더 가까운 이미지를 갖게됩니다. 더 어두운 빨간색 픽셀은 멀리 떨어져 있습니다. 귀하의 질문에, 당신이 실제로 디스크 에서이 이미지를로드하는 것 같아요.

uniform sampler2D depthMap; 

void main() 
{ 
    // read a value from the depth map 
    lowp vec3 colourFromDepthMap = texture2D(depthMap, gl_FragCoord.xy); 

    // discard the current fragment if it is less close than the stored value 
    if(colourFromDepthMap.r > gl_FragCoord.w) discard; 

    ... set gl_FragColor appropriately otherwise ... 
} 

EDIT2 :

은 다음처럼 뭔가를 할 것, 미래의 조각 쉐이더에 텍스처를 사용하려면, 당신은 RGBA 값 here에 깊이에서 훨씬 똑똑 매핑을 볼 수 있습니다. 해당 문서에 직접 연결하려면 OES_depth_texture가 iPad 또는 3 세대 iPhone에서 지원되지 않습니다. 나는 다른 곳에서 완전한 테스트를하지 않았다.

+0

답장을 보내 주셔서 감사합니다. GPU 왕복 여행에 대해 조금 더 자세히 설명해 주시겠습니까? 나는 그 부분을 이해하고 있는지 잘 모르겠습니다. – sharvey

+0

질문과 완전히 관련이있는 것은 아닙니다. '그림자에 깊이 맵을 사용하려면 어떻게해야합니까?'질문과 관련이 있습니다. 실제로 GPU에 깊이지도를 만들고지도를 유지하기 위해 무언가를 그립니다. 디스크에서로드하는 것이 아니라 나중에로드합니다. 하지만 예제 코드를 조금 더 추가했습니다. 아직 모호 할 수 있습니다. – Tommy

+0

와우, 정말 고마워. – sharvey