Q100311: 사용자 정의 렌더러 플러그인에서 라이브 렌더링을 구현하는 방법

요약

이 문서에서는 렌더러 플러그인에서 라이브 렌더링을 구현하는 방법을 설명하고 다음 주제를 다룹니다.

  • 속성 규칙
  • RendererInfo 플러그인 함수
  • 렌더 플러그인 기능
  • 파이썬 유틸리티
    - 라이브렌더API
    -
    라이브렌더액션
    - 콜백
  • 고차스
    - 단일 샘플링 업데이트
    - 비지속적 업데이트

LiveRendering에 대한 일반적인 설명은 Katana 사용자 가이드의 렌더링 유형 섹션에서 확인할 수 있으며, 렌더링 수행의 라이브 렌더링 시작 및 중지 하위 섹션라이브 렌더링 제어 섹션을 참조하세요.

렌더러 플러그인 의 다른 부분에 대한 자세한 설명과 LiveRendering과 직접 관련이 없는 RenderAPI의 다른 기능에 대한 문서는 Katana 개발자 가이드의 렌더러 플러그인 섹션 에서 찾을 수 있습니다.

더 많은 정보

속성 규칙

Katana 의 라이브 렌더링 시스템은 씬 그래프의 속성을 기반으로 합니다. 효율성을 위해 렌더러 업데이트에 필요한 속성만 렌더 플러그인으로 전송됩니다. 이러한 속성을 결정하는 속성 규칙은 다음과 같습니다.

liveRender.<updateGroup>.<attributeName>

이미지__3_.png

<updateGroup> - 이것은 속성을 단일 업데이트로 그룹화하는 데 사용되는 GroupAttribute입니다.

<attributeName> - 모니터링할 최상위 속성의 이름입니다. 위 이미지에서 liveRender.geoXform.xform 속성은 라이브 렌더 시스템에 변경 사항을 최상위 xform 속성으로 전송하도록 지시합니다. 이 속성은 일반적으로 <updateGroup> 과 동일한 값을 갖는 StringAttribute입니다. 이는 레거시 환경의 이유로 사용되지만 일반적으로 내부적으로 사용되지는 않습니다. 동일한 업데이트 그룹에 여러 속성이 지정된 경우, 속성 중 하나가 변경될 때마다 모든 속성이 렌더러로 전송됩니다.

RendererInfo 플러그인 함수

 void fillLiveRenderTerminalOps( OpDefinitionQueue & terminalOps ,
                              const FnAttribute::GroupAttribute& stateArgs )

노드 그래프에서 위의 속성 규칙을 설정할 수 있지만, 일반적으로 RendererInfo 플러그인의 fillLiveRenderTerminalOps() 함수를 사용하여 라이브 렌더가 시작될 때 속성을 자동으로 설정하는 것이 더 유용합니다. 이 함수에는 terminalOps 라는 인수가 전달되는데, 이 인수는 std::deque 이며, op 유형( std::string )과 op 인수( GroupAttribute )를 포함하는 std::pair 객체가 없거나 여러 개 포함되어 있습니다.

예를 들어, 아래 코드는 /root/world/lgt 아래의 조명 위치의 xform 속성의 변경 사항을 모니터링합니다 .

 FnAttribute::GroupBuilder opArgs;
opArgs. set ( "type" , FnAttribute::StringAttribute( "light" ));
opArgs. set ( "location" , FnAttribute::StringAttribute( "/root/world/lgt" ));
opArgs. set ( "attributeNames" , FnAttribute::StringAttribute( "xform" ));
terminalOps.push_back( std ::make_pair( "LiveRenderFilter" , opArgs.build()));

Katana 와 함께 제공되는 여러 가지 Geolib3 Ops가 여기서 유용합니다.

라이브렌더필터

라이브 렌더링을 위해 모니터링해야 하는 속성을 나타내는 데 사용됩니다. 여러 속성을 하나의 LiveRenderFilter로 모니터링할 수 있으며, 속성 중 하나라도 변경되면 모든 속성이 하나의 GroupAttribute로 전송됩니다. 이는 위에서 설명한 liveRender 속성 규칙을 설정하는 표준 방식입니다.

OpArgs

- attributeNames (StringAttribute) - 속성 이름은 변경 사항을 모니터링해야 하며, 속성 이름이 변경될 때마다 단일 업데이트로 렌더 플러그인에 전송되어야 합니다.

- location (StringAttribute) - 이 op가 적용되는 첫 번째 위치를 정의하는 CEL 표현식입니다. 이후 모든 자식 위치에 적용됩니다.

- 제외 (StringAttribute) - (선택 사항) 이 작업이 실행되어서는 안 되는 제외 위치 유형 목록입니다.

- typeAlias (StringAttribute) - (선택 사항) 렌더 플러그인에 전송될 'type' 속성의 이름입니다. 설정하지 않으면 위치 유형이 대신 사용됩니다.

- type (StringAttribute) - (선택 사항) 설정된 경우 op는 이 유형의 위치에서만 실행됩니다.

- collectUpstream (IntAttribute) - (선택 사항) 0이 아닌 경우 각 부모 위치에서 모니터링되는 각 속성의 값도 라이브 렌더링 업데이트에 포함됩니다.

라이브어트리뷰트

이 op는 조작 중에 뷰어 조작자가 생성하는 값을 저장합니다(조작이 완료되고 매개변수가 확정될 때까지 기다리는 것과는 대조적으로). 이 op는 라이브 렌더링 모듈에서 특별히 찾는 특별한 경우입니다.

OpArgs

이 op에 대한 인수는 Live Render 시스템에서 자동으로 설정되므로 수동으로 설정해서는 안 됩니다.

로컬라이즈Xform

모든 상위 위치의 xform을 xform.matrix라는 단일 세계 공간 행렬로 평면화합니다.

OpArgs

- excludeCel (StringAttribute) - op가 적용되지 않아야 하는 장면 그래프 위치를 설명하는 CEL 표현식입니다.

- addMaterialHash (IntAttribute) - (선택 사항) 이전 버전의 라이브 렌더링에 대한 레거시 동작입니다. 0이 아닌 경우 'material' 속성의 해시된 값은 'materialHash'로 저장됩니다.

- outputAttrName (StringAttribute) - (선택 사항) 새 로컬 xform 속성을 저장하는 데 사용할 이름입니다. 기본값은 'xform'이며 기존 속성을 덮어씁니다.

LocalizeLiveAttributeXform

뷰어에서 조작하는 동안 위치의 실제 xform 속성은 (펜이 위로 올라갈 때까지) 변경되지 않습니다. 대신 LiveAttribute 연산을 사용하여 임시 xform을 liveAttributes.xform 아래에 저장합니다. 이 연산은 localizeXform과 유사하게 작동하지만, liveAttribute 규칙을 인식하고 있으므로 xform이 있는 경우 liveAttributes.xform이 대신 사용됩니다. 이를 통해 조작 중에 위치 xform을 업데이트할 수 있습니다. 당연히 이 연산은 LiveAttribute 연산 이후에 적용되어야 합니다.

OpArgs

- addMaterialHash (IntAttribute) - (선택 사항) 이전 버전의 라이브 렌더링에 대한 레거시 동작입니다. 0이 아닌 경우 'material' 속성의 해시된 값은 'materialHash'로 저장됩니다.

로컬라이즈라이트리스트라이브렌더필터

이 Op는 표준 LiveRenderFilter Op를 조명 목록에 사용하도록 특별히 개발된 기능입니다. LiveRenderFilter Op와 유사하게 동작하지만, 각 위치의 lightList 속성에 대한 추가 정보를 생성합니다. 이 정보에는 조명 경로, 현재 위치에 대한 조명 연결 활성화 여부, 그리고 상위 위치에서 활성화 여부가 포함됩니다. 이 정보는 "lightLink" 업데이트로 렌더 플러그인에 전송됩니다.

OpArgs

- attributeNames (StringAttribute) - 속성 이름은 변경 사항을 모니터링해야 하며, 속성 이름이 변경될 때마다 단일 업데이트로 렌더 플러그인에 전송되어야 합니다.

- location (StringAttribute) - 이 op가 적용되는 첫 번째 위치를 정의하는 CEL 표현식입니다. 이후 모든 자식 위치에 적용됩니다.

- 제외 (StringAttribute) - (선택 사항) 이 작업이 실행되어서는 안 되는 제외 위치 유형 목록입니다.

- typeAlias (StringAttribute) - (선택 사항) 렌더 플러그인에 전송될 'type' 속성의 이름입니다. 설정하지 않으면 위치 유형이 대신 사용됩니다.

- type (StringAttribute) - (선택 사항) 설정된 경우 op는 이 유형의 위치에서만 실행됩니다.

- collectUpstream (IntAttribute) - (선택 사항) 0이 아닌 경우 각 부모 위치에서 모니터링되는 각 속성의 값도 라이브 렌더링 업데이트에 포함됩니다.

CoordinateSystemLiveRenderFilter

이는 표준 LiveRenderFilter 연산의 또 다른 특수화입니다. 좌표계와 함께 사용됩니다. LiveRenderFilter 연산과 동일하게 동작하지만, 먼저 현재 위치가 /root/world/globals.coordinatesystems 속성에 나열되어 있는지 확인하고, 해당 값이 참인 경우에만 실행을 계속합니다.

OpArgs

- attributeNames (StringAttribute) - 속성 이름은 변경 사항을 모니터링해야 하며, 속성 이름이 변경될 때마다 단일 업데이트로 렌더 플러그인에 전송되어야 합니다.

- location (StringAttribute) - 이 op가 적용되는 첫 번째 위치를 정의하는 CEL 표현식입니다. 이후 모든 자식 위치에 적용됩니다.

- 제외 (StringAttribute) - (선택 사항) 이 작업이 실행되어서는 안 되는 제외 위치 유형 목록입니다.

- typeAlias (StringAttribute) - (선택 사항) 렌더 플러그인에 전송될 'type' 속성의 이름입니다. 설정하지 않으면 위치 유형이 대신 사용됩니다.

- type (StringAttribute) - (선택 사항) 설정된 경우 op는 이 유형의 위치에서만 실행됩니다.

- collectUpstream (IntAttribute) - (선택 사항) 0이 아닌 경우 각 부모 위치에서 모니터링되는 각 속성의 값도 라이브 렌더링 업데이트에 포함됩니다.

렌더러 플러그인 기능

 int startLiveEditing()
 int stopLiveEditing()

이 두 함수는 Katana 에서 호출되어 라이브 렌더링이 활성화되고 위치 업데이트가 예상될 때 알려줍니다.

 int processControlCommand( const std::string & command )

이 함수는 Katana UI에서 렌더 플러그인으로 통신하는 방법입니다. UI는 Python LiveRenderAPI.SendCommand() 함수를 통해 문자열로 명령을 전송할 수 있으며, 렌더 플러그인에서 원하는 용도로 처리할 수 있습니다.

 int queueDataUpdates(FnAttribute::GroupAttribute updateAttribute)

모니터링되는 속성이 변경되면 이 함수를 통해 새 값이 렌더 플러그인으로 전달됩니다. 전달된 속성에는 세 개의 자식 속성이 포함됩니다.

  • type - 업데이트 유형( 위의 속성 규칙 섹션에 나열된 <updateGroup> 입니다)
  • 위치 - 이 업데이트가 적용되는 장면 그래프 위치입니다.
  • 속성 - 변경된 속성의 값입니다. 위치가 삭제된 경우 ' 삭제됨' 이라는 이름의 속성이 포함됩니다.

이 함수는 라이브 렌더링 업데이트를 수신하기 위한 전용 스레드에서 호출됩니다.

 bool hasPendingDataUpdates()

이 함수는 queueDataUpdates() 에 대기 중인 라이브 렌더 업데이트가 있는지 여부를 renderboot 프로세스에 알려줍니다.

 int applyPendingDataUpdates() 

이 함수는 메인 렌더 스레드에서 호출되며, 대기 중인 모든 라이브 업데이트를 가져와 실제로 적용합니다. hasPendingDataUpdates() 가 true를 반환하는 경우에만 호출됩니다.

파이썬 유틸리티

Katana 의 UI에는 라이브 렌더링 환경을 개선하는 데 도움이 되는 여러 가지 유틸리티가 있으며, 그 내용은 다음과 같습니다.

라이브렌더API

이 API를 사용하면 LiveRenderAPI.SendCommand()LiveRenderAPI.SendData() 함수를 사용하여 실행 중인 라이브 렌더에 사용자 지정 명령(문자열) 또는 라이브 업데이트를 전송할 수 있습니다. 또한 라이브 렌더 하위 시스템에서 사용 중인 터미널 작업 목록을 쿼리하고 수정하는 다양한 함수도 제공합니다. 이러한 터미널 작업은 노드에서 생성된 현재 씬 그래프를 변경하는 대신, 위치가 변경되는 시점을 확인하는 데 사용됩니다. 이는 RendererInfo::fillLiveRenderTerminalOps() 호출 중에 전달된 작업을 효과적으로 변경하는 방법입니다.

라이브렌더액션

plugin_apis/python/BaseLiveRenderAction.py 에 있는 클래스를 사용하여 Render > Live Rendering 메뉴를 사용자 지정 메뉴 항목으로 확장할 수 있습니다. BaseLiverRenderAction 클래스( QtGui.QAction 에서 파생됨)에서 파생하고 멤버 함수를 재정의하기만 하면 됩니다. 그러면 클래스에서 LiveRenderAPI를 포함한 Katana 의 모든 Python API를 활용하여 사용자 지정 명령이나 업데이트를 렌더 플러그인에 전송할 수 있습니다. LiveRenderAction 인스턴스는 UI 세션 중에만 로드되도록 $KATANA_RESOURCES/UIPlugins 디렉터리에 배치해야 합니다.

콜백

Katana 렌더 플러그인에 라이브 업데이트 또는 라이브 렌더 명령을 전송하기 전에 각각 onLiveRenderUpdate 또는 onLiveRenderCommand라는 콜백을 트리거합니다. 이 콜백에는 렌더 플러그인에 전달될 command 또는 update 속성이 전달됩니다. 이는 주로 모니터링 목적으로, 렌더 플러그인에 전달되는 데이터를 검사할 수 있도록 하지만, 예외를 발생시켜 메시지 전송을 차단할 수도 있습니다. 단, 이 경우 Katana 의 메시지 로그에 오류 메시지가 기록됩니다.

고차스

단일 샘플링 업데이트

렌더링이 시작되면 geolib은 모션 블러 등을 구현하기 위해 다중 샘플링된 속성을 생성합니다. 그러나 Katana UI에서는 일반적으로 속성이 단일 샘플을 사용하여 검색되고 라이브 렌더링 업데이트는 Katana UI에서 제공됩니다. 즉, 라이브 업데이트 중에 전송되는 속성은 일반적으로 단일 시간 샘플만 갖습니다.

비지속적 업데이트

렌더가 시작되면 Katana 는 장면을 생성하는 op 트리를 디스크에 기록하고, 자체 Geolib3 런타임을 사용하는 렌더 프로세스에서 이를 읽습니다. 렌더 플러그인은 장면 그래프와 해당 속성을 쿼리하기 위해 SceneGraphIterator에 액세스할 수 있습니다. 하지만 이 장면은 변경할 수 없습니다. Katana 에서 라이브 렌더 업데이트가 전달되면 Geolib3 런타임을 업데이트할 수 없습니다. 즉, 렌더 플러그인이 라이브 업데이트를 수신하더라도 SceneGraphIterator는 항상 원본 장면을 반환합니다. 따라서 SceneGraphIterator를 사용하여 추가 정보를 안전하게 가져올 수 없으므로, 라이브 업데이트 속성에는 렌더 플러그인에 필요한 모든 정보가 포함되어야 합니다.

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

    이유를 알려주세요