Q100508: 계층적(인스턴스 소스) 인스턴싱으로 장면 그래프 쿠킹 성능 향상

팔로우

요약

반복되는 형상이 있는 모든 장면에서 인스턴싱을 사용하면 메모리 사용량을 줄이고 장면 그래프 쿠킹 성능을 높일 수 있습니다. 일반적으로 인스턴스화는 여러 복사본에서 형상이 동일하고 필요한 유일한 수정 사항은 변환일 때 잘 작동합니다. 이 문서에서는 "계층적 인스턴스화"라는 인스턴스 소스를 사용하여 인스턴스화하는 방법을 설명하고 이를 포인트 클라우드의 점에 대한 인스턴스 형상에 사용하는 방법의 예를 제공합니다.

사용 가능한 다른 인스턴스화 접근 방식에 대한 개요를 보려면 Katana 개발자 가이드: 인스턴스화 의 다음 섹션을 읽어보세요.

포인트 클라우드 인스턴스화에 대한 아래 섹션을 설명하는 예제 프로젝트는 Katana 프로젝트 파일 " PointcloudInstancingAndMaterialAssign_Arnold.katana "를 참조하십시오.

계층적 인스턴스화 개요

다음 섹션은 계층적 인스턴스화에 대한 간략한 개요입니다. 인스턴싱에 대한 보다 심층적인 논의를 위해 Renderman 문서: RenderMan 25 Docs - Katana 의 인스턴싱에서는 인스턴싱에 대한 소개로서 세 가지 인스턴싱 방법을 모두 설정하는 방법을 보여줍니다.

계층적 인스턴스화에서는 장면 그래프 위치의 전체 계층이 인스턴스화될 수 있습니다. 인스턴스 위치는 인스턴스가 포함될 장면 그래프 위치이며, 인스턴스는 장면 그래프의 소스 위치 아래에 있는 형상으로 정의됩니다. 인스턴스 소스는 장면 그래프 위치의 유형 속성을 "인스턴스 소스"로 설정하여 선언됩니다. 인스턴스 위치 자체는 type 속성을 "instance"로 설정하여 선언됩니다.

인스턴스 소스 는 인스턴스화할 계층구조의 최상위 위치를 나타내는 그룹 위치의 type 속성을 “인스턴스 소스”로 설정하여 선언한다.

인스턴스 위치는 "인스턴스" 유형이어야 합니다. 인스턴스 소스 장면 그래프 위치를 가리키는 기하학.instanceSource 문자열 속성이 이러한 위치에 설정되어야 합니다.

포인트 클라우드에 대한 계층적 인스턴스화

포인트 클라우드에 대한 인스턴스화는 이전 섹션에서 설명한 단일 인스턴스 위치에 대한 인스턴스화와 유사합니다. 차이점은 "인스턴스" 유형의 여러 위치를 사용하는 대신 인스턴스 위치가 인스턴스 소스를 가리키는 기하학.instanceSource 문자열 속성이 있는 "pointcloud" 유형의 한 위치라는 것입니다. 다음 단계에서는 이 설정을 설명합니다.

1. Alembic_In을 사용하여 인스턴스 소스를 가져온 다음 장면 그래프에서 형상의 상위 위치 유형을 "인스턴스 소스"로 설정합니다.

2. Alembic_In을 사용하여 Alembic 포인트 클라우드를 가져온 다음 인스턴스 소스를 가리키도록 기하학.instanceSource 속성을 설정합니다.

이 방법을 사용하면 장면의 개별 인스턴스를 덜 세밀하게 제어할 수 있다는 점에 유의하세요. 예를 들어, 포인트 클라우드의 각 포인트에 대해 장면 그래프 위치가 생성되지 않기 때문에 개별 인스턴스에 서로 다른 재질을 할당하는 것은 쉽게 불가능합니다. 그러나 이 방법을 사용하면 동일한 재질의 셰이더 속성이 임의의 속성을 가진 개별 인스턴스에 따라 달라질 수 있습니다. 또한 포인트 클라우드를 확장하면 모든 인스턴스도 확장되며 개별 인스턴스의 변환은 쉽게 수정할 수 없습니다. 재료 변형이 필요하거나 변형에 대한 더 많은 제어가 필요한 경우 아래 섹션에서 더 사용자 정의 가능한 OpScript 접근 방식을 읽어 보십시오.

OpScript Lua를 사용하여 포인트 클라우드에 대한 계층적 인스턴싱

포인트 클라우드에 대한 계층적 인스턴스화를 통해 포인트 클라우드의 각 포인트에 대해 위치의 전체 계층이 인스턴스화될 수 있습니다. OpScript를 사용하여 포인트 클라우드의 각 포인트에 대한 장면 그래프에서 인스턴스 위치를 생성하면 각 인스턴스에 개별적으로 다양한 재료를 할당하고 인스턴스 위치 변환을 더 효과적으로 제어할 수 있다는 이점이 있습니다. 잠재적인 단점은 특히 수천 개의 인스턴스가 있는 경우 약간 더 다루기 힘든 장면 그래프입니다. 다음은 포인트 클라우드에 대한 계층적 인스턴스화를 달성하는 단계입니다.

1. Alembic_In 노드를 사용하여 포인트 클라우드와 인스턴스 소스를 가져옵니다. 그런 다음 인스턴스 소스의 유형 속성을 "인스턴스 소스"로 설정합니다.

2. OpScript 노드를 생성하고 해당 위치 매개변수를 인스턴스가 생성되어야 하는 장면 그래프 위치로 설정합니다(예: "/root/world/geo/derivedassets").

3. OpScript 노드에서 user.instanceSourceLocation 매개변수를 생성하고 이를 인스턴스 소스의 장면 그래프 위치로 설정한 후 user.pointCloudLocation을 설정합니다. 매개변수를 포인트 클라우드의 장면 그래프 위치로 설정합니다. 사용자 매개변수 생성 단계는 Katana 사용자 가이드: 사용자 매개변수 추가를 참조하세요.

4. 그런 다음 다음 코드를 OpScript 노드의 스크립트 매개변수에 복사하여 각 포인트에 대한 인스턴스 위치를 생성합니다.

 -- Read op arguments
local instanceSourceLocation = Interface.GetOpArg( "user.instanceSourceLocation" ):getValue()
local pointCloudLocation = Interface.GetOpArg( "user.pointCloudLocation" ):getValue()

if Interface.AtRoot() then
 
-- Read the point cloud
 
local points = Interface.GetAttr( "geometry.point.P" , pointCloudLocation):getNearestSample(Interface.GetCurrentTime())

 
-- Loop over points
 
local x, y, z
 
local gb = GroupBuilder()
 
for i= 0 , #points/ 3 - 1 do
     x = points[
3 *i+ 1 ]
     y = points[
3 *i+ 2 ]
     z = points[
3 *i+ 3 ]

     
-- Build op arguments for the child location
     gb:update(Interface.GetOpArg())
     gb:set(
"childAttrs" , Interface.GetAttr( "" , instanceSourceLocation))
     gb:set(
"childAttrs.type" , StringAttribute( "instance" ))
     gb:set(
"childAttrs.geometry.instanceSource" , StringAttribute(instanceSourceLocation))
     gb:set(
"childAttrs.xform.interactive.translate" , DoubleAttribute({x, y, z}))

     
-- Create the child
     Interface.CreateChild(
         
string . format ( "child%04d" , i),
         Interface.GetOpType(),
         gb:build())
 
end
else
 
local childAttrs = Interface.GetOpArg( "childAttrs" )
 
for i= 0 , childAttrs:getNumberOfChildren() -1 do
     Interface.SetAttr(childAttrs:getChildName(i), childAttrs:getChildByIndex(i))
 
end
end

위의 OpScript는 포인트 클라우드의 각 포인트에 대해 '인스턴스' 유형의 위치를 생성하고 각 인스턴스 위치의 기하학.instanceSource 속성을 user.instanceSourceLocation 매개변수에 지정된 인스턴스 소스로 설정합니다 .

5. 마지막으로 렌더링에서 생략되도록 Prune 또는 VisibilityAssign 노드를 사용하여 장면 그래프에서 포인트 클라우드 위치를 제거합니다. VisibilityAssign 노드를 사용하면 뷰어에 포인트가 계속 표시되는 반면 Prune 노드를 사용하면 뷰어에 인스턴스 표시가 없도록 비워 둘 수 있습니다.

재료 할당을 통한 재료 변형

인스턴스별로 재질을 수정하면 모든 인스턴스가 할당된 재질과 같은 인스턴스 소스의 속성을 상속하므로 추가 작업이 발생할 수 있습니다. 이 섹션에서는 인스턴스화의 성능 이점을 유지하면서 인스턴스별로 재질과 셰이더를 변경하는 방법을 설명합니다.

OpScript를 사용하여 리프 수준 및 계층적 인스턴스화를 사용하여 포인트 클라우드의 각 포인트에 대한 인스턴스 위치를 생성하면 인스턴스 위치별로 재료를 할당할 수 있다는 이점이 있습니다.

인스턴스 위치를 생성한 후 각 인스턴스의 위치에 따라 재료가 달라질 수 있습니다. 특정 인스턴스를 식별하는 것은 장면 그래프에서 인스턴스 위치를 확장하고 뷰어에서 원하는 인스턴스를 선택하는 것만큼 간단합니다. 제공된 예제 프로젝트에서 인스턴스 위치는 /root/world/geo/derivedassets 위치 아래에서 찾을 수 있습니다.

그런 다음 MaterialAssign 노드를 사용하거나 인스턴스 위치에 MaterialAssign 속성을 설정하여 재질 위치를 가리키는 방식으로 원하는 위치에 재질을 할당할 수 있습니다.

추가 읽기

인스턴스화 개요는 아래 첫 번째 리소스 링크를 참조하세요. 아래의 다른 리소스에서는 각 인스턴스화 방법에 대한 기타 고급 인스턴스화 주제에 대해 자세히 설명합니다.

첨부 파일

우리는 문제로 불편을 끼쳐 드려 죄송합니다

이유를 알려주세요