요약
반복되는 지오메트리가 있는 모든 장면에서 인스턴싱을 사용하면 메모리 사용량을 줄이고 씬 그래프 쿡 성능을 향상시킬 수 있습니다. 일반적으로 인스턴싱은 여러 복사본에서 지오메트리가 동일하고 필요한 수정 사항이 변환뿐일 때 효과적입니다. 이 문서에서는 "계층적 인스턴싱"이라는 인스턴스 소스를 사용한 인스턴싱 방법을 설명하고, 이를 사용하여 포인트 클라우드의 포인트에 지오메트리를 인스턴스화하는 방법을 예시로 보여줍니다.
사용 가능한 다른 인스턴싱 접근 방식에 대한 개요는 Katana 개발자 가이드의 다음 섹션인 인스턴싱을 읽어보세요.
아래 섹션의 포인트 클라우드 인스턴싱을 설명하는 예제 프로젝트는 Katana 프로젝트 파일 PointcloudInstancingAndMaterialAssign_Arnold.katana 를 참조하세요.
더 많은 정보
계층적 인스턴싱 개요
다음 섹션에서는 계층적 인스턴싱에 대한 간략한 개요를 제공합니다. 인스턴싱에 대한 자세한 내용은 RenderMan 설명서를 참조하십시오. RenderMan 26 Docs - Katana 의 인스턴싱 에서는 인스턴싱 소개를 위해 세 가지 인스턴싱 방법을 모두 설정하는 방법을 보여줍니다.
계층적 인스턴싱에서는 씬 그래프 위치의 전체 계층 구조를 인스턴스화할 수 있습니다. 인스턴스 위치는 인스턴스를 포함할 씬 그래프 위치이며, 인스턴스는 씬 그래프에서 소스 위치 아래의 지오메트리에 의해 정의됩니다. 인스턴스 소스는 씬 그래프 위치의 type 속성을 "instance source"로 설정하여 선언합니다. 인스턴스 위치 자체는 type 속성을 "instance"로 설정하여 선언합니다.
인스턴스 소스는 인스턴스화될 계층의 최상위 위치를 나타내는 그룹 위치의 유형 속성을 "인스턴스 소스"로 설정하여 선언됩니다.
인스턴스 위치는 "instance" 유형이어야 합니다. 이러한 위치에는 geometry.instanceSource 문자열 속성을 설정하여 인스턴스 소스 씬 그래프 위치를 가리켜야 합니다.
포인트 클라우드에 대한 계층적 인스턴싱
포인트 클라우드에 대한 인스턴싱은 이전 섹션에서 설명한 단일 인스턴스 위치에 대한 인스턴싱과 유사합니다. 차이점은 "인스턴스" 유형의 여러 위치를 사용하는 대신, 인스턴스 위치가 인스턴스 소스를 가리키는 geometry.instanceSource 문자열 속성을 가진 "포인트클라우드" 유형의 단일 위치라는 것입니다. 다음 단계에서는 이러한 설정을 설명합니다.
1. Alembic_In을 사용하여 인스턴스 소스를 가져온 다음, 씬 그래프에서 지오메트리의 부모 위치 유형을 instance source 로 설정합니다.
2. Alembic_In을 사용하여 Alembic 포인트 클라우드를 가져온 다음 geometry.instanceSource 속성을 인스턴스 소스를 가리키도록 설정합니다.
이 방법을 사용하면 씬의 개별 인스턴스에 대한 세밀한 제어가 어려워집니다. 예를 들어, 포인트 클라우드의 각 포인트에 대해 씬 그래프 위치가 생성되지 않기 때문에 개별 인스턴스에 서로 다른 재질을 할당하는 것은 쉽지 않습니다. 그러나 이 방법을 사용하면 동일한 재질의 셰이더 속성을 임의의 속성을 가진 개별 인스턴스에 맞게 변경할 수 있습니다. 또한, 포인트 클라우드를 스케일링하면 모든 인스턴스의 스케일도 변경되므로 개별 인스턴스의 변환을 쉽게 수정할 수 없습니다. 재질을 변경하거나 변환에 대한 더 세밀한 제어가 필요한 경우, 아래 섹션에서 사용자 정의가 더 용이한 OpScript 접근 방식을 참조하십시오.
OpScript Lua를 사용하여 포인트 클라우드에 계층적 인스턴싱
포인트 클라우드에 대한 계층적 인스턴싱을 사용하면 포인트 클라우드의 각 포인트에 대해 전체 위치 계층을 인스턴스화할 수 있습니다. OpScript를 사용하여 포인트 클라우드의 각 포인트에 대한 씬 그래프에서 인스턴스 위치를 생성하면 각 인스턴스에 서로 다른 재질을 개별적으로 할당하고 인스턴스 위치 변환을 더욱 효과적으로 제어할 수 있다는 장점이 있습니다. 하지만 잠재적인 단점은 특히 인스턴스가 수천 개일 경우 씬 그래프가 다소 복잡해진다는 것입니다. 포인트 클라우드에 대한 계층적 인스턴싱을 구현하는 단계는 다음과 같습니다.
1. Alembic_In 노드를 사용하여 포인트 클라우드와 인스턴스 소스를 가져옵니다. 그런 다음 인스턴스 소스의 유형 속성을 "인스턴스 소스"로 설정합니다.
2. OpScript 노드를 만들고 위치 매개변수를 인스턴스가 생성되어야 하는 씬 그래프 위치로 설정합니다(예: "/root/world/geo/derivedassets").
3. OpScript 노드에서 user.instanceSourceLocation 매개변수를 생성하고 이를 인스턴스 소스의 씬 그래프 위치로 설정하고 user.pointCloudLocation 을 설정합니다. 포인트 클라우드의 씬 그래프 위치에 대한 매개변수입니다. 사용자 매개변수를 만드는 단계는 Katana 사용자 가이드: 사용자 매개변수 추가를 참조하세요.
4. 그런 다음 다음 코드를 OpScript 노드의 script 매개변수에 복사하여 각 지점에 대한 인스턴스 위치를 생성합니다.
-- 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는 포인트 클라우드의 각 포인트에 대해 'instance' 유형의 위치를 생성하고 각 인스턴스 위치의 geometry.instanceSource 속성을 user.instanceSourceLocation 매개변수에 지정된 인스턴스 소스로 설정합니다.
5. 마지막으로, Prune 또는 VisibilityAssign 노드를 사용하여 씬 그래프에서 포인트 클라우드 위치를 제거하여 렌더링에서 제외합니다. VisibilityAssign 노드를 사용하면 뷰어에서 포인트가 계속 표시되는 반면, Prune 노드를 사용하면 뷰어에서 인스턴스 표시가 비어 있게 됩니다.
재료 할당을 통한 재료 변형
인스턴스별로 머티리얼을 수정하면 모든 인스턴스가 할당된 머티리얼과 같은 인스턴스 소스의 속성을 상속하므로 추가 작업이 발생할 수 있습니다. 이 섹션에서는 인스턴스화의 성능 이점을 유지하면서 인스턴스별로 머티리얼과 셰이더를 변경하는 방법을 설명합니다.
OpScript를 사용하여 리프 수준 및 계층적 인스턴싱을 사용하여 포인트 클라우드의 각 포인트에 대한 인스턴스 위치를 생성하면 인스턴스 위치별로 재료를 할당할 수 있다는 이점이 있습니다.
인스턴스 위치를 생성한 후, 각 인스턴스의 위치별로 재료를 변경할 수 있습니다. 특정 인스턴스를 식별하는 것은 Scene Graph에서 인스턴스 위치를 확장하고 뷰어에서 원하는 인스턴스를 선택하는 것만큼 간단합니다. 제공된 예제 프로젝트에서 인스턴스 위치는 /root/world/geo/derivedassets location 아래에서 찾을 수 있습니다.
그런 다음 MaterialAssign 노드를 사용하거나 인스턴스 위치에 materialAssign 속성을 설정하여 재료 위치를 가리키면서 재료를 원하는 위치에 할당할 수 있습니다.
추가 읽기
인스턴싱 개요는 아래 첫 번째 리소스 링크를 참조하세요. 아래의 다른 리소스에서는 각 인스턴싱 방법과 관련된 고급 인스턴싱 주제에 대해 자세히 설명합니다.
- Katana 개발자 가이드: 인스턴싱
- Q100517: Leaf 수준(인스턴스 ID) 인스턴싱을 통한 씬 그래프 쿠킹 성능 향상
- Q100514: 인스턴스 배열 인스턴싱을 통한 씬 그래프 쿡 성능 향상
- Renderman 문서: RenderMan 26 문서: Katana 의 인스턴싱
첨부 파일
우리는 문제로 불편을 끼쳐 드려 죄송합니다
이유를 알려주세요