SceneDepth
깊이 버퍼에 저장된 값은 삼각형의 정점 3개가 세계 뷰-정점 행렬에 의해 변환된 후 삼각형의 보간 w 좌표로 나눈 삼각형의 보간 z 좌표다. 깊이 버퍼를 텍스처로 사용하여, 그 픽셀의 뷰포트 위치를 현재 뷰-투영 매트릭스의 역순으로 변환한 다음 그 결과를 w 성분으로 곱하여 깊이 버퍼에 렌더링된 객체의 월드 스페이스 위치를 추출할 수 있다.
뷰포트 공간의 픽셀 위치로 뷰포트 위치를 정의한다. 즉, x 및 y components가 화면 중앙이 (0, 0)이고 -1~1의 범위에 있다.해당 픽셀의 깊이 버퍼에 저장된 깊이가 z component가 되고 w component는 1로 설정된다.
SceneDepth
깊이 버퍼에 저장된 값은 삼각형의 정점 3개가 세계 뷰-정점 행렬에 의해 변환된 후 삼각형의 보간 w 좌표로 나눈 삼각형의 보간 z 좌표다. 깊이 버퍼를 텍스처로 사용하여, 그 픽셀의 뷰포트 위치를 현재 뷰-투영 매트릭스의 역순으로 변환한 다음 그 결과를 w 성분으로 곱하여 깊이 버퍼에 렌더링된 객체의 월드 스페이스 위치를 추출할 수 있다.
뷰포트 공간의 픽셀 위치로 뷰포트 위치를 정의한다. 즉, x 및 y components가 화면 중앙이 (0, 0)이고 -1~1의 범위에 있다.해당 픽셀의 깊이 버퍼에 저장된 깊이가 z component가 되고 w component는 1로 설정된다.
//Get the depth buffer value at this pixel.
float zOverW = tex2D(depthTexture, texCoord);
// H is the viewport position at this pixel in the range -1 to 1.
float4 H = float4(texCoord.x * 2 - 1, (1 - texCoord.y) * 2 - 1, zOverW, 1);
// Transform by the view-projection inverse.
float4 D = mul(H, g_ViewProjectionInverseMatrix);
// Divide by w to get the world position.
float4 worldPos = D / D.w;
카메라 걸리는 구간에 PostProcess Volume - PP 쉐이더 |
오브젝트 뒤에 있는 오브젝트가 앞에 보이게 |
IF 노드 사용시
- 특정 값과 커스텀 뎁스 값을 비교해서 커스텀뎁스는 붉게 나머지는 SceneTexture가 나오는 노드
아래 시각화이미지를 통해 B의 CustomDepth적용된 오브젝트외의 값은(흰바탕) 10000이상이다는 결론 -> 검증 -> |
테스트로 A값 10000과 Clamp를 건 CustomDepth*0.0002의 값을 비교하는데 Clamp의 Max값이 10000미만일떄는 주황, 같을때는 블루, 초과일떄는 SceneTexture임을 확인 |
|
B의 시각화 |
|
|
|
- 커스텀뎁스와 씬뎁스를 비교해서 씬뎁스가 커스텀뎁스보다 앞에 있을때(물체가 앞에 있을떄)는 위의 결과값(커스텀뎁스만 붉고 나머진 SceneTexture값)을 내놓는다.
IF 노드 없이
A |
|
B |
|
C |
|
D=clamp(1-(A*B), 0, 1) |
E=A*C |
F=clamp(D*E, 0,1) |
F를 알파값으로 |
|
이 방법으론 카메라가 항상 오브젝트에서 일정한 거리에 있으면 써도 문제가 없을거 같다.
'Material, BluePrint > Material' 카테고리의 다른 글
지구 (0) | 2020.11.03 |
---|---|
customdepth (0) | 2020.07.17 |
PostProcess - Radial Blur (0) | 2020.07.15 |
Pivot Painter 2.0를 이용해 작업중~ (0) | 2020.05.26 |
UE4 - ICE / Mineral (0) | 2020.05.07 |