첨부동영상의 시각적 오류가 밝은 환경에서는 모르고 지나칠 수 있으나, 어두운 무드 에서는 명확하게 보이므로 개발에 문제가 되고 있습니다.
[Attachment Removed]
첨부동영상의 시각적 오류가 밝은 환경에서는 모르고 지나칠 수 있으나, 어두운 무드 에서는 명확하게 보이므로 개발에 문제가 되고 있습니다.
[Attachment Removed]
재현 방법
1) 씬에 랜드스케이프 나나이트 테셀레이션을 제외한 시각정보에 방해되는 모든걸 제거합니다.
2) 언릿 뷰모드 상태에서 뷰포트 카메라를 테셀레이션과 근접하게 위치시킨 후 하늘 방향으로 돌린다.
3) 카메라를 이동시키면 테셀레이션 표면과 별개로 하늘방향에 오프셋이 맞지않는 테셀레이션 잔상같은것이 보인다.
[Attachment Removed]
안녕하세요.
5.7.4 버전에서 재현해 보았지만 동일한 증상을 확인하기 어려웠습니다.
[Image Removed]재현 가능한 샘플 프로젝트를 함께 첨부해주시면 도움이 될 것 같습니다.
감사합니다.
[Attachment Removed]
혹시 특정 플래그 때문에 발생하는것인지 확인을 좀 해보겠습니다.
[Attachment Removed]
첨부한 프로젝트를 여신 후 TesBug 레벨에 TessBug 시퀀스를 플레이하시면 현상 보실 수 있습니다.
5.7.3 순정엔진 입니다. [Image Removed]
[Attachment Removed]
5.7.4에서도 동일하게 발생합니다.
[Attachment Removed]
안녕하세요.
이 이슈는 Displacement 입력을 머티리얼 그래프에서 스케일할 때 발생할 가능성이 큽니다.
Nanite Displacement 경로에서는 Displacement 핀이 단순한 강도값이 아니라 0~1 범위의 height 입력처럼 처리됩니다. 실제 셰이더에서는 이 값을 saturate로 0~1에 고정한 뒤 ((Input - Center) * Magnitude)로 최종 변위를 계산합니다. 반면 Nanite는 머티리얼 그래프의 최종 출력 분포를 직접 분석하지 않고, Displacement Scaling의 Center와 Magnitude만을 기준으로 displacement bounds와 culling 범위를 계산합니다.
이 때문에 Displacement 값을 머티리얼 그래프에서 Multiply 같은 연산으로 직접 스케일하면, 실제 표면 변위와 Nanite가 가정하는 displacement 범위 사이에 불일치가 생길 수 있습니다. 그 결과 공중에 보이지 않는 추가 지형이 있는 것처럼 보이거나, 실루엣이 깨져 보이는 아티팩트가 발생할 수 있습니다.
Displacement 핀에는 가능하면 최종 0~1 범위의 height 값만 넣고, 변위의 세기 조절은 머티리얼 그래프가 아니라 Displacement Scaling의 Magnitude로 처리하는 것을 권장 드립니다.
감사합니다.
[Attachment Removed]
랜드스케이프 레이어가 다수 사용되므로 레이어간 밸런스를 맞추기 위해서는 Displacement Scaling의 Magnitude만으로 조절하기 어려우며, Multiply 하더래도 0~1 범위에서 사용하는것은 당연합니다.
샘플로 제공드린 Multiply value도 0.1이므로 0~0.1 범위입니다.
그리고 말씀주신대로 Displacement 값을 머티리얼 그래프에서 Multiply 같은 연산으로 직접 스케일 하던 부분을 제거해도 동일하게 문제 발생합니다.
제대로 테스트 부탁드리고, 모범적인 해소법이 없다면 하루라도 빨리 공식 이슈로 등록해주셨으면 좋겠습니다.
[Attachment Removed]
[mention removed] 이 이슈 대응 부탁드립니다.
[Attachment Removed]
[mention removed] 혹시 이 이슈도 살펴주실 수 있을까요?
[Attachment Removed]
안녕하세요.
먼저 답변이 지연된 부분에 대해 사과드립니다. 불편을 드려 죄송합니다.
보내주신 샘플 프로젝트를 기반으로 추가 테스트 및 엔진 소스 코드 분석을 진행하였으며, 현재까지의 진행 사항을 공유드립니다.
전달해 주신 샘플 프로젝트에서 머티리얼 로직에서 Displacement 관련 추가 연산을 제거하면 해당 아티팩트가 사라지는 것을 확인하였습니다. 다만 말씀하신 내용처럼 실제 프로젝트에서는 다수의 랜드스케이프 레이어를 사용하시거나 복잡한 연산이 있는 경우 문제가 발생할 수 있을 것 같습니다.
추가로 엔진 소스 코드를 확인한 결과, 나나이트 디스플레이스먼트의 내부 동작에서 아티팩트의 원인으로 추정되는 부분을 발견하였습니다.
나나이트 디스플레이스먼트는 두 개의 독립된 계산 경로를 사용하고 있습니다.
Bounds/Culling을 계산하는 CPU 경로의 경우 PrimitiveComponentHelper.h를 보면 Displacement의 최소/최대 범위를 계산할 때 DisplacementScaling의 Center와 Magnitude만 사용하며, 머티리얼 그래프의 실제 출력을 평가하지 않고 Displacement 출력이 0에서 1까지 전체 범위를 사용할 것으로 가정하고 있습니다.
// Engine/Public/PrimitiveComponentHelper.h:58-59
const float MinDisplacement = (0.0f - DisplacementScaling.Center) * DisplacementScaling.Magnitude;
const float MaxDisplacement = (1.0f - DisplacementScaling.Center) * DisplacementScaling.Magnitude;
반면 실제 렌더링이 수행되는 GPU 경로에서는 머티리얼 그래프의 실제 출력값을 사용합니다. MaterialTemplate.ush에서 머티리얼 그래프의 Displacement 출력을 saturate로 [0,1] 범위에 클램프한 뒤, NaniteRasterizationCommon.ush에서 이 값을 기반으로 실제 displacement를 계산합니다.
// Engine/Shaders/Private/MaterialTemplate.ush:3829
return saturate(PixelMaterialInputs.Displacement);
// Engine/Shaders/Private/Nanite/NaniteRasterizationCommon.ush:545, 558
float NormalizedDisplacement = GetMaterialDisplacement(PixelMaterialInputs);
const float Displacement = (NormalizedDisplacement - DisplacementParams.Center) * DisplacementParams.Magnitude * DisplacementFade;
CPU 경로에서는 머티리얼 그래프의 Displacement 출력이 0~1 전체 범위를 사용할 것으로 가정하고 있으나 GPU 경로에서는 실제 머티리얼 그래프 결과를 사용하고 있습니다. 머티리얼 그래프에서 Multiply 등의 연산이 적용되면 실제 출력 범위가 좁아지지만, Bounds 계산은 여전히 0~1 전체 범위를 기준으로 실행됩니다. 보내주신 샘플 프로젝트의 설정값(Center=0.0, Magnitude=4.0)을 기준으로 보면, Height를 Displacement 핀에 직접 연결한 경우에는 Bounds 범위(0 ~ 4.0)와 실제 표면 이동 범위(0 ~ 4.0)가 일치합니다. 그러나 Multiply ×0.01을 적용하면 실제 출력 범위는 0 ~ 0.01로 좁아져 실제 표면 이동 범위는 0 ~ 0.04이지만 Bounds는 여전히 0 ~ 4.0을 기준으로 계산하여 약 3.96만큼 실제보다 크게 잡힙니다.
그 결과 Bounds가 실제보다 크게 계산되어 나나이트의 클러스터 계층 구조와 컬링 판정에 오류가 발생하고, 이것이 말씀해주신 아티팩트로 나타나는 것으로 추정됩니다.
위 분석 결과를 바탕으로 재현 조건과 엔진 코드 근거를 정리하여 공식 버그 리포트를 제출하였으며, 이후 담당 부서와의 내부 검토를 거쳐 아래 티켓이 생성되었습니다. 리포트 제출 후 바로 안내드리지 못하고 내부 검토가 지연되어 공유가 늦게 된 점 사과드립니다.
https://issues.unrealengine.com/issue/UE\-370671
감사합니다.
[Attachment Removed]
답변 감사합니다. 이슈 트래킹 하도록 하겠습니다.
[Attachment Removed]