역자의 말 : 한국에는 NDC 가 있다면 중국에는 TGDC 가 있습니다. TGDC 의 시작은 그리 오래 되지 않았는데~ 한국의 NDC 의 영향을 많이 받은 행사 입니다. 텐센트 게임 디벨롭먼트 컨퍼런스 행사 인 것이죠. 주로 심천 본사 쪽에서 열리는데요... 2024년 기점으로 NDC 는 외부 공개를 안하는 것으로 바뀌어서 많이 아쉽습니다. 텐센트가 TGDC 를 본격적으로 시작 한 시기를 보면 넷이즈에 비해 전반적으로 개발력이 떨어진다는 평판이 지배적일 때인 2016년 이후에 조금씩 시작되게 되는데요... 초창기에는 주로 넥스트 스튜디오(상해) 가 주도 했다가 2020년 이후 텐센트 게임즈가 본격적으로 차세대기 프로젝트들에 엄청난 돈을 쓰기 시작하면서 다양한 외부 개발자들이 합류 하고(중국계 미국인 부터 등등... ) 나서 더욱 강연 내용이 고도화 되기 시작했습니다. 아무튼... 국내에는 이제 이렇다할만한 게임 개발자 컨퍼런스가 없다는 점이 참 아쉽네요.
TGDC2022 | 셰이더부터 시작하여 언리얼 5를 우아하게 플레이하는 방법!
출처: 게임 싱크탱크
에픽게임즈의 Developer relation 테크 아트 전문가인 매트 오즈탈레이는 새로운 UE5 엔진에 대한 개발자들의 요청에 부응하여 언리얼 엔진 사용자들이 리얼타임 렌더링과 인터랙션의 한계를 뛰어넘을 수 있도록 열심히 노력해왔습니다.10년 이상 게임 업계에 깊이 관여한 그는 헤일로, 콜 오브 듀티, 월드 오브 탱크와 같은 클래식 시리즈에 참여했으며 셰이더 사용에 대한 특별한 통찰력을 보유하고 있습니다.
텐센트 게임 아카데미에서 주최한 TGDC2022 텐센트 게임 개발자 컨퍼런스에서 매트 오즈탈레이(Matt Oztalay)는 UE4와 UE5만의 시스템을 사용하여 셰이더에 데이터를 공급하는 것부터 데이터를 처리하는 것, 셰이더가 묘사하는 매력적인 세계를 꼼꼼하게 설명하는 것까지 디스플레이와 머티리얼 간의 커뮤니케이션에 대한 다섯 가지 기술 프로세스를 공유했습니다.
다음은 연설의 전문입니다:
저는 현재 에픽게임즈의 개발자 릴레이션 부문 테크 아트 스페셜리스트로 일하고 있는 매트 오즈탈레이입니다.오늘 제가 여러분과 공유할 주제는 셰이더로 월드 페인팅입니다.머티리얼을 세상과 격리시킬 필요는 없으며, 실제로 외부 세계에 대한 정보를 머티리얼에 전달하면 멋진 작업을 할 수 있습니다.잠재적인 이점을 가진 정보를 자료로 가져오는 방법의 몇 가지 예를 들어 보겠습니다.
먼저 제 소개부터 하겠습니다.저는 게임 업계에서 11년째 일하고 있으며, 현재 에픽에서 업계 안팎의 언리얼 엔진 사용자들과 함께 기술 및 아트 문제를 해결하는 업무를 담당하고 있습니다.저는 9년 동안 6개의 게임 엔진을 사용해 12개 이상의 게임을 개발했습니다.
저는 몇 년 전 에픽게임즈에 개발자 관계 테크니컬 아티스트로 입사했고, 지금은 언리얼 엔진 사용자를 대상으로 교육과 안내를 통해 기술 확장의 경계를 탐구하는 데 주력하고 있습니다.
이 글에서는 최근 출시된 언리얼 엔진 5.0과 노드 기반 스크립팅 및 머티리얼 시스템을 사용하여 이러한 기술을 보여드리겠습니다.각 예제는 두 부분으로 나뉘는데, 첫 번째 파트에서는 UE4와 UE5 전용 시스템을 사용하여 셰이더에 데이터를 공급하는 방법을, 두 번째 파트에서는 해당 데이터로 무엇을 할 수 있는지에 대해 설명합니다.
또한 머티리얼을 다루는 방법, 즉 머티리얼 데이터를 다루는 방법은 모든 유형의 셰이딩 언어에 광범위하게 적용될 수 있어야 한다고 생각합니다.이 공유를 듣고 나면 UE5의 일부 기능이 UE4에 비해 사용하기 더 좋아졌다는 것을 이해할 수 있을 것입니다.
오늘 보여드릴 다섯 가지 기법은 머티리얼과 소통하는 다양한 방법을 보여드릴 것입니다.
첫 번째는 동적 머티리얼 예시를 통해 자동차 대시보드에 애니메이션을 적용하는 방법을 보여줍니다.이를 통해 런타임에 머티리얼의 텍스처, 벡터 및 스칼라 파라미터를 변경할 수 있습니다.
두 번째는 커스텀 프리미티브 데이터를 사용하여 멀티플레이어 슈팅 게임에 따라 팀 컬러를 변경하고 지오메트리에 스칼라 및 벡터 값을 저장할 수 있습니다.
세 번째는 인스턴스별 커스텀 데이터를 사용하여 체인을 구동하는 방법입니다.
네 번째 방법은 런타임 가상 텍스처를 사용하여 지형에 데코레이션을 통합하는 방법입니다.
마지막 방법으로는 머티리얼 파라미터 세트를 사용하여 텍스처를 월드 스페이스에 투영하는 방법을 보여드리겠습니다(머티리얼 파라미터 세트는 다양한 머티리얼에서 읽을 수 있는 스칼라 및 벡터 파라미터의 글로벌 구조입니다).
예제에서 일부 계산이 CPU에서 GPU로 전송되는 것을 볼 수 있는데, 경우에 따라 이러한 전송이 많은 성능 이점을 제공하기 때문입니다.예시 중 하나에서는 GPU 연산을 한 번만 수행한 다음 그 결과를 반복해서 사용하겠습니다.이러한 기술의 또 다른 이점은 크리에이티브 효율성을 높일 수 있다는 점입니다. 반복 시간을 줄이거나 프로젝트에 필요한 에셋을 줄여 콘텐츠를 쉽게 제작하고 작업을 더 쉽게 할 수 있습니다.
바로 본론으로 들어가 보겠습니다!
언리얼 엔진의 기본적인 기능부터 시작해 보겠습니다.파라미터나 입력 변경을 지원하는 다이내믹 머티리얼 인스턴스를 만들 수 있는데, 이는 같은 머티리얼을 사용하면서 다른 입력을 자주 처리해야 할 때 유용합니다.
이를 설명하기 위해 자동차 머티리얼만 사용하여 다이얼에 애니메이션을 적용해 보겠습니다.언리얼 엔진과 함께 제공되는 고급 캐리어 템플릿에서 여러 가지 다이얼을 설정하고 버텍스 셰이더의 효율적인 애드온 기능인 월드 포지션 오프셋을 사용하여 각 다이얼에 애니메이션을 적용하겠습니다.속도계, 회전 속도계, 연료 게이지, 온도 게이지 등 다양한 다이얼은 각기 다른 값에 해당합니다.
기존의 접근 방식 또는 CPU로 실행하는 방식은 모든 정보를 가져와 프레임별로 구성 요소의 위치를 업데이트하는 것입니다.그러나 이러한 CPU 기반 접근 방식은 특히 컴포넌트 수가 너무 많을 때 엄청난 오버헤드를 유발할 수 있습니다.중요한 점은 플레이하는 동안에는 실제로 자동차 내부의 대시보드에 신경 쓰지 않기 때문에 회전 정보와 연산을 GPU로 옮길 수 있다는 점입니다.
이를 위해 먼저 다이얼의 최소 및 최대 값과 포인터 회전의 최대 한계에 대한 일회성 파라미터 업데이트를 통해 다이얼 머티리얼을 인스턴스화합니다.그런 다음 관련 정보를 각 머티리얼에 전달합니다.예를 들어 120도에서 320도 사이의 값을 표시하려면 오일 온도 표시기는 약 1/4 회전이 필요하지만 속도계는 0에서 10,000rpm으로 이동하는 데 3/4 회전이 필요합니다.
CPU를 통해 연산을 수행하고 각 다이얼에 하나의 '회전 값'을 전달할 수도 있지만, 저는 가능한 한 CPU 사용량을 최소화하는 것이 목표이기 때문에 GPU를 선호합니다.마지막으로 모든 입력 파라미터를 기반으로 각 다이얼의 회전 값을 계산하고 버텍스 셰이더를 사용하여 회전할 수 있습니다.
아래에서 시연해 보겠습니다.동영상에서 볼 수 있듯이 온도와 연료 게이지의 두 개의 다이얼이 있습니다.운전할수록 속도계가 커지고 회전 속도계도 그에 따라 움직입니다.차량이 멈추면 속도계도 0으로 떨어집니다.
이 다이얼은 각각 머티리얼에 정보를 전달하는 별도의 컴포넌트로, 재생을 시작할 때 머티리얼을 인스턴스화하고 검색을 위해 저장한 다음 일회성 파라미터 값을 전달했습니다.
효율성을 위해 최대, 최소 및 회전 제한을 머티리얼 내에서 분할할 수 있는 벡터에 담았습니다.머티리얼 인스턴스에서 "벡터 파라미터 설정"을 호출하고 이름을 머티리얼에 설정할 이름으로 설정한 다음 블루프린트에 "표시 값"을 머티리얼 인스턴스에 전달하는 함수가 있습니다.이제 다이얼은 동일한 파라미터 이름인 표시 값을 사용하게 되는데, 표시되는 세부 사항은 플레이어가 관심을 가질 필요가 없기 때문입니다.
다이얼의 블루프린트에는 타코미터의 RPM, 속도계의 속도 등 각 다이얼에 적합한 값을 입력합니다.각 프레임에는 최신 값이 표시되며, 이것이 바로 청사진 측면에서 다루는 내용입니다.각 다이얼은 이 모든 로직이 실행되는 자체적인 청사진입니다.
머티리얼의 경우 벡터 파라미터를 설정했습니다.작업을 더 쉽게 하기 위해 BP에서 가져온 것과 일치하도록 각 채널의 이름을 지정했습니다.
월드 포지션 오프셋 또는 버텍스 셰이더로 인디케이터를 회전하려면 회전 값도 0에서 1 사이로 설정해야 합니다.먼저 입력 표시값을 정규화해야 하는데, 전달된 최소값과 최대값이 0과 '회전 제한'에 해당하므로 표시값은 0에서 1이 아닌 1보다 작아집니다.
예를 들어, 오일 온도는 화씨 120도에서 320도까지 약 1/4 회전으로 표시되므로 다이얼을 한 번 돌리면 580도입니다.따라서 다이얼을 한 바퀴 돌릴 때의 값이 무엇인지 알아내야 합니다.이를 위해서는 입력 표시 값을 0과 1/회전 제한의 최대값 사이에서 정규화해야 하는데, 1/회전 제한의 최대값은 다이얼을 한 바퀴 회전할 때 표시되는 값을 나타내기 때문입니다.물론 다이얼이 '폭파'되는 것을 피하기 위해서입니다.클램프 노드를 사용하여 값을 최소 0과 회전 제한으로 제한하겠습니다.
0에서 1 범위의 회전 값으로 회전축을 중심으로 회전 노드를 사용하여 정점을 얼마나 오프셋해야 하는지 계산할 수 있으며, 회전축을 중심으로 회전하면 델타 값을 제공하여 주어진 축을 중심으로 주어진 피벗 포인트에서 주어진 비율만큼 벡터를 회전시킬 수 있습니다.
이를 위해 현재 튜플이 월드 스페이스에서 가리키고 있는 벡터인 오브젝트 오리엔테이션을 회전 축으로 사용하겠습니다.피벗 포인트의 경우 이 다이얼이 액터에 내장되어 있으므로 액터나 오브젝트 위치가 아닌 튜플 원점이 필요하므로 0,0,0을 로컬 공간에서 월드 공간으로 변환해야 합니다. 그러면 회전할 것은 버텍스의 위치인 절대 월드 포지션이 됩니다.
이를 렌더링하려면 앞서 계산한 양에 따라 월드 스페이스의 튜플 원점에서 오브젝트 방향 축을 중심으로 이 다이얼의 각 버텍스를 회전시켜야 합니다.Rotate About Axis의 노드 출력을 메인 머티리얼 월드 포지션 오프셋의 노드 입력에 전달하기만 하면 됩니다.
언리얼 엔진에서는 각 버텍스에 대해 버텍스 셰이더를 실행하여 지오메트리에 인코딩된 위치에 배치하고 월드 플레이스에서 오프셋할 수 있는 옵션이 있습니다.
물론 버텍스가 움직이면, 특히 회전하면 포인팅과 조명 및 셰이딩에 문제가 생길 수 있습니다.따라서 버텍스 자체를 회전하는 것과 마찬가지로 버텍스 노멀도 회전해야 합니다.
다행히도 이제 이러한 노드가 있으므로 입력을 연결하고 머티리얼 노드의 노멀 사이에 새 출력을 전달하기만 하면 됩니다.이제 다이얼의 노멀이 위치 변화에 따라 올바른 방향을 가리키게 됩니다.그런 다음 이를 월드 플레이스 기본 노멀 값으로 사용하고 필요한 다른 노멀 맵을 혼합할 수 있습니다.
이 방법의 장점을 보여드리기 위해 머티리얼과 다이얼 컴포넌트 업데이트를 별도로 표시하는 다이얼 블루프린트를 보여드리겠습니다.이 블루프린트 방법을 사용하면 포스트 틱 컴포넌트 업데이트에 0.5밀리초가 추가됩니다.
보시다시피 지금 머티리얼을 회전하고 있는데, 컴포넌트를 회전하고 있다면 포스트 틱 컴포넌트 업데이트와 트랜스폼 또는 렌더 데이터에 대한 추가 드로 호출을 해야 합니다.다시 전환하면 그런 호출이 사라집니다.따라서 이를 회전하려면 CPU가 불필요한 연산을 많이 수행해야 하는데, 컴포넌트 업데이트가 한두 개에 불과하면 큰 문제가 되지 않지만 많은 컴포넌트를 업데이트하면 오버헤드가 증가합니다.
자세히 살펴보기 전에 할 수 있는 일은 훨씬 더 많습니다.예를 들어 다이내믹 머티리얼 인스턴스의 정보를 수정할 수 있는데, 멋진 작업이지만 런타임에 관리해야 하는 새 머티리얼 인스턴스를 엉망으로 만들고 싶지 않습니다.새로운 다이내믹 인스턴스마다 별도의 드로 호출이 필요하기 때문입니다(언리얼 엔진에 내장된 다이내믹 병합 배치를 사용하여 동일한 모델과 머티리얼을 가진 오브젝트를 하나의 드로로 결합할 수 있지만).
동일한 머티리얼을 사용하지만 지오메트리의 값을 수정할 수 있습니다.인스턴스별로 하지 않고 머티리얼에서 값을 조회할 수 있다면 모든 동일한 머티리얼을 일괄 처리하고 한 번만 그리기 호출을 할 수 있습니다.이렇게 하면 많은 수의 에셋을 살펴볼 필요가 없습니다.
언리얼 엔진에서는 이 기술을 커스텀 프리미티브 데이터라고 합니다.
커스텀 프리미티브 데이터는 텍스처는 같지만 다른 입력으로 작업할 때 유용합니다.그리고 가변 주파수 업데이트가 가능하므로 이 이점을 다이어그램으로 보여드리겠습니다!
이 이미지의 한쪽에는 파란색 팀이 있고 다른 한쪽에는 빨간색 팀이 있습니다.요소(또는 지오메트리)의 값으로 기본 색을 설정할 수 있습니다.
예를 들어, 머티리얼의 기본 색상을 빨간색과 파란색으로 설정하고 싶지 않고 모든 것에 대한 페인트 호출을 일괄 처리하고 싶습니다. 또한 아티스트가 맵을 만들 때 약간의 자유도를 갖기를 원하는데, 새로운 에셋을 생성할 필요 없이 이러한 파라미터를 설정할 수 있으면 아티스트에게 많은 자유와 반복 시간을 단축할 수 있게 됩니다.
이 기법은 언리얼 엔진을 사용할 때 다른 많은 대안보다 훨씬 효율적입니다.
단순한 흔들기만 하기 때문에 전체 시뮬레이션보다 GPU 계산 속도가 빠르며, 스태틱 메시이기 때문에 수동으로 애니메이션을 적용하는 스킨 메시보다 빠릅니다; 스태틱 메시의 계층적 인스턴스화를 사용하기 때문에 하나의 큰 스태틱 메시를 사용했을 때보다 GPU에서 계산 효율이 더 높습니다.
엔진이 자동으로 제거하기 때문에 다음을 수행할 수 있습니다.스플라인의 단일 링크만 신경 쓰기 때문에 체인의 각 부분이 다른 지오메트리일 필요가 없으며, 몇 가지 사용자 파라미터에 따라 동적으로 구성되므로 배치 및 변경도 더 쉽습니다.
어쨌든 하나의 체인만 필요하다면 ChainA, B, C, D, E ...... 하지만 체인의 회전축(체인의 시작에서 끝까지의 벡터), 체인의 회전 각도(체인이 스플라인을 따라 얼마나 회전하는지), 회전의 원점 등 많은 것을 알아야 합니다.
좋은 소식은 블루프린트에서 이 모든 정보를 얻는 것이 매우 간단하며, 언리얼 엔진의 인스턴스별 커스텀 데이터 덕분에 스크립트를 통해 체인 링크의 각 인스턴스에 이러한 값을 설정할 수 있다는 것입니다.다이얼과 마찬가지로 다이내믹 머티리얼을 인스턴스화하고 체인의 시작점과 끝점을 벡터 파라미터로 임포트합니다.
각 체인 링크에 대해 두 가지 중요한 사항을 파악해야 합니다.
첫째, 서로 다른 링크의 상대적 위치에 따라 링크가 얼마나 흔들리는지 알아야 하는데, 이것이 링크의 스윙 비율입니다.
그런 다음 회전 축을 구성할 수 있습니다.시작점과 끝점 사이의 백분율 거리인 스칼라 값을 사용하겠습니다.선(라인)에서 가장 가까운 지점을 찾을 수 있는데, 이것이 라인 퍼센트입니다. 인스턴스별 사용자 지정 데이터를 사용하여 이 두 부동 소수점 값을 각 인스턴스에 전달하겠습니다.다이얼과 마찬가지로 여기에 색상으로 표시한 월드 포지션 오프셋을 사용하여 이 링크에 애니메이션을 적용해야 합니다.예를 들어 이 보라색 점을 찾으려면 녹색 선을 따라 인스턴스당 지점을 알아야 하고 이 파란색 선이 흔들리고 있습니다.
그러나 체인의 시작점과 끝점처럼 일부 값은 전체 체인에 전역적이기 때문에 모든 것이 인스턴스 단위는 아닙니다.따라서 이전과 마찬가지로 동적 머티리얼 인스턴스를 생성하고 체인의 시작점과 끝점을 머티리얼의 벡터로 설정했습니다.GPU 계산을 단순화하기 위해 이 모든 작업을 월드 스페이스에서 수행했습니다.지역화된 엔드포인트를 월드 스페이스에 넣은 것을 볼 수 있습니다.
숫자 커스텀 데이터 플로트를 사용하여 인스턴스화된 스태틱 메시 컴포넌트에 인스턴스별 데이터를 전달할 것임을 엔진에 알려야 합니다."스웨이 양"과 "라인 퍼센트"입니다.인스턴스화된 스태틱 메시에서 커스텀 프리미티브 데이터를 설정할 수도 있지만, 컴포넌트의 모든 인스턴스에 적용됩니다.
라인 퍼센트는 체인에서 벡터까지의 거리이고, 스웨이 량은 주어진 각 링크에서 체인까지의 거리를 기준으로 계산한 값입니다.따라서 체인을 얻으려면 체인 퍼센트를 사용하여 스웨이 량을 계산해야 하는데, 한 번만 계산하면 되므로 GPU 대신 CPU를 사용할 수 있습니다.따라서 구성 스크립트에서 모든 인스턴스를 반복하여 이 값을 설정할 것이며, 체인 퍼센트는 현재 체인 수를 총 링크 수로 나눈 값입니다.
둘째, 링크가 얼마나 흔들려야 하는지 알아내야 합니다.체인 퍼센트를 -1에서 1 사이의 0에서 1로 리매핑한 다음 π의 코사인에 리매핑된 체인 퍼센트를 곱한 다음 2로 나눈 값인 이 함수에 입력하겠습니다.
이렇게 하면 대략 다음과 같은 그래프가 나타납니다.단순한 선형 보간을 수행했을 때 얻을 수 있는 곡선보다 훨씬 낫습니다.
그런 다음 0과 1 사이의 값을 인스턴스별 사용자 정의 데이터의 플로트로 가져올 것입니다.이것이 제 "스웨이 양"과 첫 번째 커스텀 데이터 플로트인 커스텀 데이터 인덱스 0이 될 것입니다. 또한 체인의 인스턴스 데이터이기도 합니다.
선 퍼센트를 구하는 것은 조금 어렵지만, 다행히 언리얼에는 "선을 따라 가장 가까운 지점 구하기" 노드가 내장되어 있으므로 여기 인스턴스화 컴포넌트에서 인스턴스의 월드 스페이스 위치를 구하겠습니다.
선의 원점은 액터의 원점이고 방향은 시작부터 끝까지의 벡터이므로 선을 따라 가장 가까운 점을 구할 수 있습니다.이를 통해 해당 지점에서 체인의 원점까지의 거리를 알고 체인의 전체 길이로 나누어 가장 가까운 지점부터 벡터까지의 거리를 알아내기만 하면 됩니다.그런 다음 컴포넌트의 두 번째 사용자 정의 데이터 값으로 설정합니다.이렇게 하면 인스턴스별 데이터 스칼라 세 개를 사용하는 것보다 오버헤드가 적으므로 머티리얼에서 이를 사용하여 전체 벡터를 다시 만들겠습니다.
머티리얼에서 먼저 시작부터 끝까지 벡터를 생성하고 정규화한 다음, 커스텀 프리미티브 데이터를 다시 사용하여 스웨이 속도와 스웨이 양을 전달할 것이므로, 건설 스크립트에서 계산한 선 퍼센트를 가져와 정규화되지 않은 벡터에 곱한 다음벡터를 곱하고 시작점에 추가하여 원점을 만듭니다.
회전 각도의 경우, 스웨이 퍼센트에 타임 사인을 곱한 다음 회전 범위를 제한할 총 스웨이 양에 인스턴스별 커스텀 데이터 0으로 전달할 총 스웨이 양을 곱합니다.여기에 총 스웨이 양을 곱하여 회전을 제한한 다음, 이 모든 것을 Rotate About Axis 노드로 임포트하고 월드 포지션 오프셋을 수행합니다.
이렇게 하면 바람에 흔들리는 체인 효과를 얻을 수 있으며, 여러 개의 체인을 만들어 각각 다르게 움직이고 다른 속도로 흔들릴 수도 있지만 링크가 하나만 있는 지오메트리입니다.
먼저 요소에서 파라미터를 찾은 다음 요소에서 머티리얼로 값을 전달한 다음 해당 파라미터를 사용하여 에셋의 색상을 사용자 지정해야 합니다.
머티리얼에는 팀 컬러라는 벡터 매개 변수가 있으며, "사용자 지정 프리미티브 데이터 사용" 확인란을 선택하여 머티리얼을 덮는 마스크를 생성했습니다.
벡터 매개변수가 "사용자 정의 프리미티브 데이터 인덱스 0, 1, 2, 3"인 것을 알 수 있습니다.이는 마스크 아래의 각 커스텀 프리미티브 데이터가 지오메트리에 패킹된 단일 부동 소수점이기 때문입니다.마스크 아래의 연속된 4개의 부동 소수점은 벡터 파라미터로 이해할 수 있습니다.그런 다음 각 엘리먼트에 커스텀 프리미티브 데이터 기본값에 엘리먼트를 추가합니다.
UE5에서는 벡터에 머티리얼의 파라미터 이름이 미리 채워집니다(UE5 버전에 새로 추가된 기능입니다).UE4에서는 여기에 서너 개의 플로트를 추가해야 하며, 빨강, 초록, 파랑 컬러와 알파 채널 각각에 대해 이 작업을 수행해야 합니다.반면 UE5에서는 이름 지정된 파라미터로 표시하고 컬러 피커로 편집할 수 있으며, 이제 레벨에서 이러한 메시를 복제하고 진행하면서 팀 컬러를 변경할 수 있습니다.
데모를 위해 커스텀 프리미티브 데이터 대신 파라미터를 사용하는 배리어 머티리얼의 인스턴스를 7개 만들었는데, 아래에서는 커스텀 프리미티브 데이터를 사용하는 배리어를 7개 더 만들었으니 어떤 차이가 있는지 살펴보겠습니다!
팀 컬러의 기본 색상을 설정하는 것 외에도 커스텀 프라임데이터는 다양한 용도로 사용할 수 있습니다.
오브젝트 마모와 같은 파라미터를 구동하는 데 사용하거나 오브젝트 표면에 적용할 데칼에 사용할 서브우브를 선택하는 데 사용할 수 있는 등 수년 동안 생겨난 몇 가지 용도를 보여드리고자 합니다.최근에는 스플라인 메시 런웨이에 '벤드' 파라미터를 전달하고 해당 프로파일의 탄젠트 라인이 변경되면 플레이어가 런웨이가 구부러진 것으로 인식하도록 스텝 패턴에 Lerp 보간 노드를 추가하는 데 사용하고 있습니다.
지오메트리를 인스턴스화하여 머티리얼에 정보를 전달하는 또 다른 방법이 있는데, 사실 같은 개념이지만 프리미티브별이 아닌 인스턴스별로도 가능합니다. 이 이미지는 커스텀 프리미티브 데이터 이미지와 비슷해 보이지만 눈썰미가 좋은 분들은 정적 메시 바디가 아닌 인스턴스화된 정적 메시 바디라는 것을 알아차리실 것입니다!액터입니다.
인스턴스별 사용자 정의 데이터는 프로그래밍한 다양한 입력에 대해 처리해야 하는 많은 수의 튜플이 있고 이러한 입력이 자주 업데이트되지 않는 경우에 유용합니다.물론 인스턴스화된 튜플을 다루기 때문에 모두 동일한 자료를 사용합니다.
이를 보여드리기 위해 애니메이션 없이 체인을 바람에 앞뒤로 흔들겠습니다.사실 이 예제는 다이얼과 마찬가지로 업데이트할 필요가 없습니다.
버텍스 셰이더에서 이 작업을 수행하지만 다이얼과 달리 체인의 모든 링크에 대해 다이내믹 머티리얼 인스턴스를 만들지 않습니다.대신 체인 링크가 흔들리도록 하기 위해 레이어로 인스턴스화된 스태틱 메시 바디를 최대한 활용합니다.LOD를 생성하는 인스턴스화된 지오메트리와 인스턴스별 커스텀 데이터입니다.
이해를 돕기 위해 스플라인을 따라 링크 인스턴스를 프로그래밍 방식으로 추가하고 해당 링크를 제어할 수 있는 블루프린트가 있다고 가정해 보겠습니다.언리얼 엔진에는 런타임에 다수의 동일한 스태틱 메시 바디를 처리할 수 있는 레이어 인스턴스화된 스태틱 메시 바디 컴포넌트가 있는데, 제가 지금 사용하고 있는 것이 바로 이 컴포넌트입니다.
이 특정 기술의 한계 중 하나는 레이어 인스턴스화된 메시 컴포넌트 각각이 별도의 드로 호출을 수행하며, 이러한 컴포넌트는 동적으로 일괄 처리되지 않는다는 점입니다.이 기법의 장점은 메모리 사용량에 관한 것입니다.
여기서는 1개의 체인 링크에 필요한 모든 체인을 곱한 N개의 체인 링크를 사용합니다.예를 들어, 저는 체인 링크에 20개의 면이 있는 링 페이스를 사용했습니다.만약 별도의 체인 세트를 만들려고 했다면 120KB의 개별 링크와 4.8MB의 결합된 체인을 비교하면 그렇게 하고 싶지 않았을 것입니다.
또 다른 장점은 아티스트가 매번 새로운 에셋을 생성하거나 미리 만들어진 체인의 제약을 받지 않고 더 자유롭게 체인을 만들 수 있다는 것입니다. 팀 기본 색상을 설정하거나 체인 링크의 커스텀 프리미티브 데이터를 애니메이션하는 것만이 아닙니다.
프로그래밍 방식으로 한 번에 많은 오브젝트를 만들 때 빛을 발합니다!프로그래밍 방식으로 건물을 빌드할 때 초목이나 잔해의 변화, 창문 등에 대한 정보에도 사용할 수 있습니다.또한 게임 성능을 시각화하기 위해 인스턴스별 커스텀 데이터를 실험하고 있습니다.
네 번째로 사용되는 기술은 런타임 가상 텍스처로, GPU를 사용하여 런타임에 필요에 따라 텍스처 데이터를 생성합니다.
큰 씬을 효율적으로 렌더링하는 방법으로 위에서 아래로 효율적으로 렌더링하므로 지형과 같은 오브젝트에 적합합니다.지형 머티리얼의 오버헤드는 일반적으로 레이어 수가 증가함에 따라 증가하지만 아티스트가 지형을 칠한 후에는 기본적으로 정적입니다.
이러한 머티리얼에 대한 대부분의 계산을 자주 업데이트되지 않는 런타임 가상 텍스처로 옮기고 거기에서 샘플링하여 지형 자체에 그릴 수 있습니다.이렇게 하면 더 많은 오버헤드가 필요한 지형 머티리얼의 비동적 부분을 매 프레임마다 고려할 필요가 없으며, 궁극적으로 화면에 픽셀을 그릴 때 픽셀의 월드 위치에서 RVT를 샘플링하기만 하면 됩니다.
RVT를 사용하는 방법에는 두 가지 측면이 있습니다.픽셀에 따라 변화하는 동일한 입력 데이터 세트에 반응해야 하는 많은 튜플이 있는 경우 읽기 측의 일관성을 유지하기 위해 해당 데이터 세트를 매 프레임마다 업데이트할 필요가 없습니다.
이 기술을 시연하기 위해 지오메트리를 추가하거나 머티리얼의 파라미터를 다시 계산할 필요 없이 지오메트리를 지형에 블렌딩하는 방법을 보여드리겠습니다.
수년 동안 직면한 많은 과제 중 하나는 지형을 강조하기 위해 사용하는 정적 지오메트리가 지형과 잘 어울리도록 하는 것이었습니다.2013년이나 14년에 다른 전 동료와 이 문제를 논의했는데, 그는 17년에 여러 게임에 큰 영향을 준 '더트 스커트'라는 지오메트리로 이 문제를 해결하는 방법을 알려주었습니다.
한때 이 기법을 사용하려면 지형의 일부와 전체 바위를 후디니로 익스포트해야 했지만, 이제 언리얼 엔진에서는 후디니 엔진을 사용하여 이 작업을 직접 수행할 수도 있습니다.그런 다음 두 지오메트리의 교차선을 찾아 바위와 지형의 서브노멀을 따라 이동하면 지오메트리의 스커트가 생성됩니다. 가장자리 주변에 알파 채널이 있어 지형 머티리얼이나 특수한 머티리얼에 적용하여 비슷한 효과를 낼 수 있으므로 모든 것이 함께 블렌딩될 수 있습니다.
지형 머티리얼과 높이를 가져와서 전체 텍스처로 익스포트해야 합니다.그런 다음 픽셀이 지형에서 얼마나 멀리 떨어져 있는지 파악하고 이를 사용하여 지형 텍스처 세트와 기본 머티리얼을 블렌딩해야 합니다.
따라서 블렌딩해야 하는 지형과 지오메트리의 모든 픽셀에 대해 전체 지형 머티리얼을 다시 계산할 필요가 없습니다.지형을 한 번 그린 다음 여러 곳에서 샘플링하면 텍스처 정보를 빠르고 깔끔하게 파악할 수 있습니다.
이것이 작동하는 이유는 RVT가 특정 머티리얼에 국한되지 않고 다른 머티리얼에서도 샘플링할 수 있기 때문에 월드 좌표만 있으면 RVT 샘플러가 해당 위치에 대한 텍스처 정보를 가져올 수 있기 때문입니다.
이 기술의 장점은 레벨에서 메시를 움직이면 메시가 자동으로 주변 지형을 잡는다는 점입니다.지오메트리를 움직일 때마다 지형 머티리얼을 추가로 재생성할 필요가 없습니다.또한 RVT 출력을 위한 기본 색상, 하이라이트, 러프니스 및 노멀을 제공할 수 있습니다.
말하자면 그 출력의 모든 세부 사항을 뒤에서 처리한 것입니다.이것이 중요한 포인트입니다!즉, 머티리얼이 RVT 주위에 그려질 때마다 머티리얼 정보가 출력되며, 이 작업만 하면 됩니다.
이제 지형 머티리얼이 있으므로 블렌디드 지오메트리에서 전체 지형 머티리얼을 실행할 필요가 없습니다.하지만 지오메트리를 기준으로 지형이 어디에 있는지 모른다면 주어진 월드 위치에서 RVT를 샘플링하면 어떤 이점이 있을까요?--블렌딩을 중지할 위치를 알고 지형 자체를 샘플링할 수 있습니다.
참고로 언리얼 엔진에는 '머티리얼 어트리뷰트'라는 개념이 있는데, 이는 가능한 모든 머티리얼 정보를 표에 담은 거대한 시스템입니다.머티리얼 정보를 병합하거나 분해할 때 유용하며, 이전 PPT의 머티리얼 어트리뷰트 가져오기 섹션이 이에 대한 내용입니다.
RVT의 채널에 대한 높이를 임포트할 수 있습니다.즉, 텍스처의 X/Y 좌표를 Z축의 높이 값과 결합할 수 있으며, 지형의 높이를 RVT에 쓰면 머티리얼의 모든 지점의 높이를 다시 지형 머티리얼로 알 수 있습니다.
여기서 제가 하는 일은 지형의 절대 월드 위치를 가져와서 마스크를 사용하여 여기 B 컴포넌트(또는 Z축)에 추가한 다음 런타임 가상 텍스처 출력 노드의 월드 높이에 공급하는 것입니다.이 RVT 드로잉 요소의 머티리얼에 높이가 설정될 때마다 해당 값이 RVT에 기록됩니다. 매우 간단하지 않나요?
오브젝트의 머티리얼에 있는 RVT의 높이 정보를 가져와야 하고, RVT의 기본값인 현재 픽셀 위치에서 RVT의 높이 정보를 가져와야 하거나 RVT 샘플링의 기본값인 현재 픽셀 위치에서 RVT의 높이 정보를 가져와야 합니다.그리는 픽셀이 지형에서 얼마나 멀리 떨어져 있는지를 알려주는 단일 스칼라 값이 필요합니다.따라서 여기서 간단한 정규화를 수행하고 현재 픽셀의 z 좌표에서 월드 높이를 빼고 스칼라 파라미터로 나누어 각 머티리얼 인스턴스를 수정해 보겠습니다.이를 포화시키고 Clamp(0,1) 사이에 유지하지만 계산 오버헤드가 적습니다.
이제 지형에 가까워질수록 색상이 어두워지고 반대로 지형에서 멀어질수록 색상이 밝아지는 그래프가 생겼습니다.블렌딩을 수행할 때 값이 1이면 지형에 가까워지고 값이 0에 가까워질수록 지형에서 멀어집니다.
이제 바위와 지형 사이의 거리를 알았으니 바위 머티리얼에 지형 머티리얼을 다시 생성하기만 하면 됩니다.이전과 마찬가지로 RVT를 샘플링하고 이제 다른 핀을 사용하겠습니다.하지만 기본 머티리얼의 모든 값을 Lerp하는 대신 머티리얼 속성을 사용하여 더 흥미로운 방법을 소개하겠습니다.
먼저 머티리얼 속성을 머티리얼에 직접 입력하면 바위가 머티리얼만 샘플링하는 것을 볼 수 있습니다.따라서 머티리얼 속성 블렌드 노드를 사용하여 지형 머티리얼을 바위의 기본 머티리얼과 블렌딩하고 앞서 생성한 거리 블렌드 값으로 이 블렌드를 구동해야 합니다.
이 기법의 또 다른 장점은 이 바위 덩어리와 같이 비교적 평평한 메시 바디를 혼합할 수 있다는 점입니다.
그러나 이 효과는 더트 스커트 기법으로 항상 가능한 것은 아닙니다.이 기법과 다른 대안의 성능 차이를 테스트하기 위해 전체 화면 쿼드를 만들고 두 가지 머티리얼, 그중 하나는 기본 RVT 블렌드이고 다른 하나는 모든 머티리얼 레이어를 블렌딩할 수 있는 머티리얼을 앞뒤로 전환해 보았습니다.
GPU에서는 베이스 패스 비용 차이가 약 0.1밀리초이므로 이점이 있는 것 같지는 않습니다.하지만 여러 개의 다른 오브젝트에 동시에 드로우 호출을 해야 할 때 이점이 분명해집니다.
저는 지난 몇 년 동안 RVT Mix와 RVT Height를 많이 사용했습니다.지형의 높이와 구조만 알고 있다면 몇 가지 다른 용도로도 사용할 수 있습니다.
예를 들어, 가장 윗부분의 높이를 알면 위에서 아래로 그리기 때문에 비와 눈에 음영을 추가하는 데 사용할 수 있고, 조명 기능이나 데칼을 사용하지 않고도 수중에 그림자를 드리우는 의사 초점을 분산시킬 수 있으며, 깊이 페이딩과 같은 비싼 기능 대신 수역의 해안선을 찾는 데 사용할 수 있고, 지형의 색상인 RVT(를 사용하여 지형에 매핑된 식물의 식생과 지면 색을 변경하고, 지형의 높이에 따라 미리 생성된 에셋을 사용하는 대신 나무 뿌리 같은 버텍스를 지면으로 이동하여 지형에 완벽하게 맞출 수 있습니다.
마지막으로 머티리얼 파라미터 컬렉션으로 무엇을 할 수 있는지 보여드리겠습니다.
머티리얼 파라미터 컬렉션은 전역적이며 모든 머티리얼이 이에 반응할 수 있습니다.이는 또한 파라미터를 업데이트할 때마다 여러 번 처리할 필요 없이 한 번만 작업을 수행하면 된다는 의미이기도 합니다.따라서 머티리얼 파라미터 컬렉션은 여러 개의 튜플이 있고 그 튜플이 동일한 입력 정보를 한 번 이상 처리해야 할 때 잘 작동합니다.
"프로젝터" 오브젝트 변환을 사용하는 방법을 보여드리겠습니다.텍스처를 월드 스페이스에 투사합니다.예를 들어, 필름을 파티클에 투사할 수 있는 것도 이 기능 중 하나입니다.
이 기술은 큰 매력으로 더 많은 시청자를 끌어들이려는 영화 제작자에게 깊은 인상을 남길 수 있으므로 그 원리를 살펴 보겠습니다.
스크린과 프로젝터가 있고 프로젝터를 사용하여 0에서 1까지의 UV 좌표를 스크린에 투사하고 있는데, 스크린 소재에서 해당 UV 좌표를 찾으려면 어떻게 해야 할까요?프로젝터의 위치와 프로젝터가 가리키는 방향을 알아야 벡터를 '프로젝터에서 픽셀'에서 '프로젝터 공간'으로 변환할 수 있습니다.
이렇게 하면 해당 벡터가 프로젝터의 순방향 벡터에서 얼마나 벗어나는지 알 수 있고 투영된 텍스처의 크기를 계산할 수 있습니다.줄자를 가지고 해당 텍스처의 치수를 측정할 수 없으므로 변환 벡터를 정규화하면 최종 UV 좌표를 얻을 수 있습니다.
이 기능의 가장 큰 장점 중 하나는 모든 텍스처가 이러한 전역 파라미터를 사용할 수 있고, 파라미터를 한 번만 설정하면 여러 곳에서 샘플링할 수 있으며, 여러 파티클 효과에 사용할 수 있고 하나의 머티리얼 함수만 사용할 수 있다는 점입니다.
문제로 돌아가서, 이제 프로젝터의 FOV(보라색 부분), 프로젝터의 위치(앞, 위, 오른쪽의 네 벡터), 그릴 픽셀을 알았습니다.월드 스페이스의 위치는 MPC_Projector라는 머티리얼 파라미터 컬렉션을 설정한 다음 앞, 위, 오른쪽 위치에 대한 네 개의 벡터 파라미터와 FOV라는 스칼라 파라미터를 설정하면 됩니다.저는 BP_Projector라는 카메라를 기반으로 블루프린트를 만들었고, 이 카메라는 매 프레임마다 세트 컬렉션 파라미터로 생성한 MPC를 가리키며 위치, 정면, 위쪽, 오른쪽 벡터와 FOV를 전송합니다.
이제 알려진 모든 정보를 수집하여 머티리얼로 전송하고 있습니다.블루프린트 쪽에서는 그렇게 하고, 머티리얼 쪽에서는 이 머티리얼 함수에 대한 모든 UV 로직을 설정한 다음 이 함수를 다양한 머티리얼에서 사용할 수 있고, UV 값을 출력하여 다른 머티리얼에서 적절하다고 생각되는 대로 사용할 수 있도록 할 것입니다.
따라서 가장 먼저 해야 할 일은 항상 '프로젝터 공간'에서 작동하는지 확인하는 것입니다.그래야 카메라가 움직이면 프로젝터도 함께 위치를 변경할 수 있습니다."프로젝터 대 픽셀" 벡터가 프로젝터 공간에서 프로젝터의 전방 벡터에서 얼마나 벗어나는지 알아내려고 노력 중입니다.
언리얼은 벡터를 만들어 임의의 공간으로 변환할 수는 없지만, 역변환 머티리얼 머티리얼 함수를 사용할 수는 있습니다.하지만 공간을 정의하는 벡터를 전달하면 기본적으로 동일한 프로퍼티를 갖습니다.
행렬 곱셈에 대해 다시 한 번 간단히 살펴보겠습니다.입력 벡터는 1x3 행렬이고, 3x3 행렬을 구성하는 세 개의 기저 벡터는 1x3 행렬을 제공합니다.이 함수는 기본적으로 기저 행렬의 각 열과 벡터의 도트 곱입니다.따라서 이 함수는 입력 벡터에 기저 벡터를 곱하고 이를 출력으로 사용하는 구성 요소이며, InVec에 BasisX를 곱하여 X 성분을 얻습니다.내장 노드를 사용하여 행렬을 만드는 단계는 건너뛰고 행렬 곱셈의 구성 요소만 다루겠습니다.
도트 곱에 대해 간단히 살펴보겠습니다.도트 곱은 두 입력 벡터의 정렬을 도출할 수 있는 스칼라 값을 반환할 수 있으며, 벡터가 서로 수직이면 0, 완전히 반대이면 음의 결과, 완벽하게 정렬되면 양의 결과를 반환합니다.
여기에는 벡터 월드 위치에서 프로젝터 위치로의 변환 벡터만 필요합니다.머티리얼 파라미터 컬렉션에서 샘플링하면 자동으로 Float4로 나타나므로 축에 마스킹합니다.
우리가 구성하고 있는 이 공간이 조금 이상하게 보일 수 있는데, 왜 프로젝터의 오른쪽 축을 BasisX로 선택했을까요?
도트 곱으로 벡터를 정렬하는 방법을 생각해낸 것을 기억하시나요?이 노드의 결과 벡터는 픽셀 대 프로젝터 도트 기준이며, 이 벡터의 X 값으로 픽셀 프로젝터 벡터가 오른쪽 벡터와 어떻게 정렬되는지 알려주고 싶습니다.
따라서 이 값은 픽셀 프로젝터가 프로젝터 전방 벡터의 오른쪽으로 이동함에 따라 증가합니다.다시 말하지만, 결과 벡터의 Y 값은 픽셀 프로젝터 벡터가 프로젝터의 위쪽 벡터와 얼마나 잘 정렬되는지 알려주기를 원합니다.
하지만 정렬이 증가하면 그 값이 감소하고 정렬이 감소하면 증가하기를 원하므로 약간 반전시키고 마지막으로 공간을 좀 더 둥글게 보이게 하려면 전방 정렬을 Z축 정렬로 만들어야 합니다.
이제 벡터를 정규화하기 위해 Z 컴포넌트를 마스킹한 다음 변환하면 X 컴포넌트를 얻을 수 있다는 점이 더 흥미로워집니다.픽셀 프로젝터 벡터가 정방향 벡터의 오른쪽으로 이동함에 따라 그 값이 0에서 1 사이로 증가합니다. 또한 픽셀 프로젝터 벡터가 정방향 벡터 아래로 이동함에 따라 0에서 1 사이로 증가되는 Y 성분을 얻습니다.이는 UV 좌표와 매우 유사합니다.
하지만 내 투영이 순방향 벡터에서 0.5 .5로 샘플링되기를 원하므로 변환된 벡터에서 0.5 .5를 빼면 올바른 벡터를 얻을 수 있어야 하나요?하지만 그런 식으로 작동하지 않습니다.변환된 벡터를 정규화할 수 없기 때문에 픽셀 프로젝터 벡터는 단위 벡터가 아니며 크기는 프로젝터와 픽셀 사이의 거리와 같고 프로젝터의 시야각을 사용하지 않기 때문에 이 벡터가 완전히 아래에 있거나 완전히 오른쪽에 있지 않으면 0에서 1 사이의 공간을 제공하지 않습니다.어떤 식으로든 도움이 되지 않습니다.
벡터를 0에서 1 공간으로 적절히 오프셋하고 정규화하려면 텍스처가 프로젝터에서 투사된 것처럼 치수가 있다는 것을 알아야 합니다.이미 픽셀 프로젝터 벡터와 그 길이를 알고 있고 프로젝터의 FOV를 알고 있으므로 이를 약간 단순화해 보겠습니다.
때로는 치수를 제거하면 문제가 더 쉬워지기도 합니다.이제 픽셀 프로젝터 벡터인 A와 프로젝터의 시야각인 θ가 있고 B를 구해야 합니다. 프로젝터의 선을 화면의 측면으로 확장하면 전체 그림이 이등변 삼각형처럼 보이며 이등변 삼각형은 두 개의 직각 삼각형으로 이루어진 것으로 생각할 수 있습니다.그러면 한 변의 변 길이와 각도만 알면 많은 것을 알 수 있습니다. 이제 FOV, 이 직각 삼각형의 면적이 이등변 삼각형의 면적의 절반이면 각도는 FOV의 각도의 절반이고, 프로젝터에서 스크린까지의 거리 인이 변의 변 길이를 알고 있으므로 삼각형의 다른 쪽 변의 길이를 계산할 수 있으면 이 변의 길이를 계산할 수 있습니다.네, 이쪽이 이 각도의 인접한 쪽입니다!
여기서는 탄젠트, 탄젠트 x 인접 에지 = 반대쪽 에지를 사용하겠습니다.카메라의 FOV가 있으므로 이를 반으로 줄인 다음 인접 에지를 픽셀에서 프로젝터까지의 거리로 사용할 수 있습니다.좀 더 명확하게 하기 위해 머티리얼의 정보를 추적하는 데 도움이 되는 새로운 네임드 리라우트 노드를 사용했습니다.
이제 언리얼 엔진의 삼각함수에 대해 간략히 살펴보겠습니다.우리 머티리얼의 삼각함수는 주기 1에 단위가 없으므로 2π 주기를 사용하는 그래프 계산기와는 매우 다릅니다.빨간색 선으로 표시된 주기 1의 사인파를 플롯했고, 주기 2는 여기서 녹색 선입니다.
따라서 그래프 계산기 도를 라디안으로 변환하려면 이 2π 라디안을 360°를 2π로 나눈 값, 즉 약 57°가 됩니다.주기 1 라디안의 경우 라디안은 1°에 불과하므로 FOV를 라디안으로 변환하려면 360°로 나누고 반대쪽 가장자리에 탄θ를 곱하여 반대쪽 가장자리 텍스처 크기의 절반을 구하면 됩니다.
이제 직각 삼각형의 반대쪽 변의 길이와 ½ FOV 각도를 알았으므로 투영된 텍스처의 크기는 그 크기의 두 배입니다.이제 UV 좌표가 (0.5, 0.5)의 중심이 아니므로 텍스처 너비의 절반으로 바이어스한 다음 텍스처 너비로 나누어 0에서 1 사이의 값을 얻어야 합니다.(0.5, 0.5)가 양수 축 바로 위에 오도록 UV 좌표가 변경된 것처럼 보입니다.
이를 좀 더 명확하게 보기 위해 0에서 1 간격에 속하지 않는 값을 마스킹 처리했습니다. 그런 다음 해당 머티리얼 함수를 사용하여 텍스처 샘플러에 UV 좌표를 출력하기만 하면 됩니다.
예를 들어, 지금 제가 해야 할 일은 비하인드 스토리 작업자를 위해 비디오를 샘플링하는 것입니다.여기에 나머지 자체 발광 스택을 삽입하고 필요에 따라 블렌딩할 수 있습니다.
이러한 모든 파티클 효과는 이제 이전에 생성된 머티리얼 함수를 사용하여 비디오를 샘플링하며, 모두 파티클에서 발생하며, 여기에는 라이트 함수처럼 더 많은 오버헤드를 유발하는 대안이 사용되지 않습니다.
라이트 기능에 대해 말하자면, 언리얼 엔진에서는 스포트라이트에 머티리얼을 적용할 수 있습니다.그렇다면 왜 사용하지 않을까요?조명 기능에는 몇 가지 제한이 있을 수 있으며, 예를 들어 조명 기능은 그레이 스케일이며 투사된 빛의 강도만 변경하고 색상은 변경하지 않는 등 상황에 정확히 맞지 않는 경우가 있습니다.따라서 풀 컬러 프로젝션의 경우 컬러 시스템에 동일한 재질을 제공해야 하는데, 이는 매우 복잡합니다.광원에 대한 조명 기능을 설정하면 이 광원이 동적 그림자 투사기로 간주되어 성능 예산에서 매우 많은 오버헤드가 발생할 수 있기 때문입니다.
대신 외부 세계의 일부 정보를 활용하면 그림자를 드리우는 조명을 사용하지 않고도 수학적 계산을 통해 수신된 머티리얼의 텍스처를 볼 수 있습니다.
성능 차이를 테스트하기 위해 두 가지 머티리얼로 전체 화면 쿼드를 다시 설정했습니다.하나는 앞의 파티클과 마찬가지로 텍스처를 투영한 것이고 다른 하나는 기본 조명 회색 머티리얼입니다.
회색 재질로 전환하면 빨간색, 녹색, 파란색 빛을 방출하는 세 개의 스포트라이트 그룹으로 전환하고 조명 기능을 통해 비디오를 재생합니다.제 기기에서는 기본 패스 비용이 거의 차이가 나지 않습니다.그러나 조명 기능은 조명, 그림자 깊이 및 그림자 투영 사이에 약 1ms의 계산 시간을 추가합니다.
지난 몇 년 동안 여러 번 사용했습니다.이제는 저에게 매우 유용한 도구가 되었기 때문에 여러분과 공유하게 되어 기쁩니다!
원문 기사.
'TECH.ART.FLOW.IO' 카테고리의 다른 글
[번역] Stencil 교차하는 방법과 주의점 (1) | 2024.07.13 |
---|---|
[번역] UE5 커스텀 메시패스 추가하기 (0) | 2024.07.09 |
[소식] 미호요 젠레스 존 제로 캐릭터 모델 공개. MMD (0) | 2024.07.05 |
[X][공유] Modular Maya character rig builder Mansur-Rig (0) | 2024.07.04 |
[번역] GPU 인스턴스 기반 잔디 렌더링 연구 노트 (2) | 2024.07.04 |