요약
이 문서에서는 렌더러 플러그인에서 라이브 렌더링을 구현하는 방법을 설명하고 다음 주제를 다룹니다.
- 속성 규칙
- RendererInfo 플러그인 기능
- 렌더 플러그인 기능
- 파이썬 유틸리티
- LiveRenderAPI
- LiveRenderActions
- 콜백 - 문제
- 단일 샘플링 업데이트
- 비지속적 업데이트
LiveRendering에 대한 일반적인 설명은 Katana 사용자 가이드의 렌더링 유형 섹션에서 해당 설명을 찾아보고 렌더링 수행의 라이브 렌더링 시작 및 중지 하위 섹션 과 라이브 렌더링 제어 섹션을 참조하세요.
렌더러 플러그인 의 다른 부분에 대한 자세한 설명과 LiveRendering과 직접적으로 관련되지 않은 RenderAPI의 다른 기능에 대한 문서는 Katana 개발자 가이드의 렌더러 플러그인 섹션 에서 찾을 수 있습니다.
추가 정보
속성 규칙
Katana 의 라이브 렌더링 시스템은 장면 그래프의 속성에 의해 구동됩니다. 효율성이라는 이름으로 렌더러를 업데이트하는 데 필요한 속성만 렌더 플러그인으로 전송됩니다. 이러한 속성이 무엇인지 결정하는 속성 규칙은 다음과 같습니다.
liveRender. <업데이트그룹> . <속성이름>
<updateGroup> - 속성을 단일 업데이트로 그룹화하는 데 사용되는 GroupAttribute입니다.
<attributeName> - 모니터링할 최상위 속성의 이름입니다. 위 이미지에서 liveRender.geoXform.xform 속성은 라이브 렌더링 시스템에 변경 사항을 최상위 xform 속성으로 보내도록 지시하고 있습니다. 이는 일반적으로 값이 updateGroup 과 일치하는 StringAttribute입니다 . 레거시 이유로 인해 발생하지만 일반적으로 내부적으로 사용되지는 않습니다. 동일한 업데이트 그룹에 여러 속성이 지정된 경우 속성 중 하나가 변경될 때마다 모두 렌더러로 전송됩니다.
RendererInfo 플러그인 기능
void fillLiveRenderTerminalOps( OpDefinitionQueue & terminalOps ,
const FnAttribute::GroupAttribute& stateArgs )
노드 그래프에서 위의 속성 규칙을 설정하는 것이 가능하지만 일반적으로 RendererInfo 플러그인의 fillLiveRenderTerminalOps()
함수를 사용하여 라이브 렌더가 시작될 때 자동으로 속성을 설정하는 것이 더 유용합니다. 함수에는 op 유형( std::string
)과 op 인수( GroupAttribute )를 포함하는 std::pair
std::deque
인 TerminalOps 라는 인수가 전달됩니다.
예. 아래 코드 는 /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) - 이 작업이 적용되는 첫 번째 위치를 정의하는 CEL 표현식입니다. 그러면 모든 하위 위치에 적용됩니다. - 제외 (StringAttribute) - (선택 사항) 이 작업이 실행되지 않아야 하는 제외된 위치 유형 목록입니다. - typeAlias (StringAttribute) - (선택 사항) 렌더링 플러그인으로 전송될 'type' 속성의 이름입니다. 설정하지 않으면 위치 유형이 대신 사용됩니다. - type (StringAttribute) - (선택 사항) 설정된 경우 작업은 이 유형의 위치에서만 실행됩니다. - CollectUpstream (IntAttribute) - (선택 사항) 0이 아닌 경우 각 상위 위치에서 모니터링되는 각 속성의 값도 라이브 렌더링 업데이트에 포함됩니다. |
LiveAttribute 이 작업은 조작 중에 뷰어 조작기에 의해 생성되는 값을 저장합니다(조작이 완료되고 매개변수가 마무리될 때까지 기다리는 것과 반대). 이 작업은 라이브 렌더링 모듈에서 특별히 찾는 특별한 경우입니다. |
OpArgs 이 작업에 대한 인수는 라이브 렌더링 시스템에 의해 자동으로 설정되며 수동으로 설정하면 안 됩니다. |
현지화Xform 모든 상위 위치의 xform을 xform.matrix라는 단일 세계 공간 행렬로 평면화합니다. |
OpArgs - 제외Cel (StringAttribute) - 작업이 적용되지 않아야 하는 장면 그래프 위치를 설명하는 CEL 표현식입니다. - addMaterialHash (IntAttribute) - (선택 사항) 이전 버전의 라이브 렌더링에 대한 레거시 동작입니다. 0이 아닌 경우 'material' 속성의 해시된 값은 'materialHash'로 저장됩니다. - outputAttrName (StringAttribute) - (선택 사항) 새 로컬 Xform 속성을 저장하는 데 사용할 이름입니다. 기본값은 'xform'으로, 기존 속성을 덮어씁니다. |
LocalizeLiveAttributeXform 뷰어에서 조작하는 동안 위치의 실제 xform 속성은 변경되지 않습니다(펜업 전까지). 대신 LiveAttributes 작업은 liveAttributes.xform 아래에 임시 xform을 저장하는 데 사용됩니다. 이 작업은 localizeXform과 유사하게 작동하지만 이 liveAttribute 규칙을 인식하므로 xform이 있는 경우 xform 대신 liveAttributes.xform이 사용됩니다. 이를 통해 위치 Xform을 조작하는 동안 업데이트할 수 있습니다. 당연히 이 작업은 LiveAttribute 작업 다음에 적용되어야 합니다. |
OpArgs - addMaterialHash (IntAttribute) - (선택 사항) 이전 버전의 라이브 렌더링에 대한 레거시 동작입니다. 0이 아닌 경우 'material' 속성의 해시된 값은 'materialHash'로 저장됩니다. |
LocalizeLightListLiveRenderFilter 이 작업은 특별히 조명 목록과 함께 사용하기 위한 표준 LiveRenderFilter 작업의 전문화입니다. 각 위치의 lightList 속성에 대한 추가 정보를 생성한다는 점을 제외하면 LiveRenderFilter 작업과 유사하게 작동합니다. 이 정보에는 조명 경로, 현재 위치에 조명 링크가 활성화되어 있는지 여부, 상위 위치에서 활성화되어 있는지 여부가 포함됩니다. 이 정보는 "lightLink" 업데이트로 렌더 플러그인에 전송됩니다. |
OpArgs - attributeNames (StringAttribute) - 속성 이름의 변경 사항을 모니터링하고 변경될 때마다 단일 업데이트로 렌더링 플러그인에 전송해야 합니다. - location (StringAttribute) - 이 작업이 적용되는 첫 번째 위치를 정의하는 CEL 표현식입니다. 그러면 모든 하위 위치에 적용됩니다. - 제외 (StringAttribute) - (선택 사항) 이 작업이 실행되지 않아야 하는 제외된 위치 유형 목록입니다. - typeAlias (StringAttribute) - (선택 사항) 렌더링 플러그인으로 전송될 'type' 속성의 이름입니다. 설정하지 않으면 위치 유형이 대신 사용됩니다. - type (StringAttribute) - (선택 사항) 설정된 경우 작업은 이 유형의 위치에서만 실행됩니다. - CollectUpstream (IntAttribute) - (선택 사항) 0이 아닌 경우 각 상위 위치에서 모니터링되는 각 속성의 값도 라이브 렌더링 업데이트에 포함됩니다. |
CoordinateSystemLiveRenderFilter 이는 표준 LiveRenderFilter 작업의 또 다른 전문화입니다. 좌표계와 함께 사용됩니다. 현재 위치가 /root/world/의 globals.coordinatesystems 속성에 나열되어 있는지 먼저 확인하고 이것이 사실인 경우에만 실행을 계속한다는 점을 제외하면 LiveRenderFilter 작업과 동일하게 작동합니다. |
OpArgs - attributeNames (StringAttribute) - 속성 이름의 변경 사항을 모니터링하고 변경될 때마다 단일 업데이트로 렌더링 플러그인에 전송해야 합니다. - location (StringAttribute) - 이 작업이 적용되는 첫 번째 위치를 정의하는 CEL 표현식입니다. 그러면 모든 하위 위치에 적용됩니다. - 제외 (StringAttribute) - (선택 사항) 이 작업이 실행되지 않아야 하는 제외된 위치 유형 목록입니다. - typeAlias (StringAttribute) - (선택 사항) 렌더링 플러그인으로 전송될 'type' 속성의 이름입니다. 설정하지 않으면 위치 유형이 대신 사용됩니다. - type (StringAttribute) - (선택 사항) 설정된 경우 작업은 이 유형의 위치에서만 실행됩니다. - 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에는 아래에 제시된 라이브 렌더링 경험을 개선하는 데 도움이 되는 여러 유틸리티가 있습니다.
LiveRenderAPI
이 API를 사용하면 LiveRenderAPI.SendCommand()
및 LiveRenderAPI.SendData()
함수를 사용하여 실행 중인 라이브 렌더링에 사용자 정의 명령(문자열) 또는 라이브 업데이트를 보낼 수 있습니다. 또한 라이브 렌더링 하위 시스템에서 사용되는 터미널 작업 목록을 쿼리하고 수정하는 다양한 기능도 있습니다. 이러한 터미널 작업은 현재 장면 그래프(노드에서 생성된 대로)를 변경하는 대신 위치가 변경되는 시기를 결정하는 데 사용됩니다. 이는 RendererInfo::fillLiveRenderTerminalOps()
호출 중에 전달된 작업을 효과적으로 변경하는 방법입니다.
LiveRenderActions
Plugin_apis/python/BaseLiveRenderAction.py의 클래스를 사용하여 사용자 정의 메뉴 항목으로 렌더링 > 라이브 렌더링 메뉴를 확장할 수 있습니다. 간단히 BaseLiverRenderAction 클래스(자체는 QtGui.QAction
에서 파생됨)에서 파생되고 멤버 함수를 재정의합니다. 그런 다음 클래스는 LiveRenderAPI를 포함한 Katana 의 Python API를 사용하여 렌더링 플러그인에 사용자 정의 명령이나 업데이트를 보낼 수 있습니다. LiveRenderActions 인스턴스는 UI 세션 중에만 로드를 시도하도록 $KATANA_RESOURCES/UIPlugins 디렉터리에 배치되어야 합니다.
콜백
라이브 업데이트 또는 라이브 렌더링 명령을 렌더링 플러그인에 보내기 전에 Katana 각각 onLiveRenderUpdate 또는 onLiveRenderCommand라는 콜백을 트리거합니다. 이러한 콜백에는 렌더링 플러그인에 전달될 명령 또는 업데이트 속성이 전달됩니다. 이는 주로 모니터링 목적으로 렌더링 플러그인에 전달되는 데이터를 검사할 수 있도록 허용하지만 예외를 발생시켜 메시지가 전송되는 것을 방지할 수도 있습니다. 그러나 이렇게 하면 Katana 의 메시지 로그에 오류 메시지가 표시됩니다.
문제
단일 샘플링 업데이트
렌더링이 시작되면 geolib는 모션 블러 등을 허용하기 위해 다중 샘플링 속성을 생성합니다. 그러나 Katana UI에서 속성은 일반적으로 단일 샘플을 사용하여만 검색되며 실시간 렌더링 업데이트는 Katana UI에서 제공됩니다. 즉, 라이브 업데이트 중에 전송되는 속성에는 일반적으로 단일 시간 샘플만 있습니다.
비지속적 업데이트
렌더링이 시작되면 장면을 생성하는 작업 트리가 Katana 에 의해 디스크에 기록되고 자체 Geolib3 런타임을 사용하는 렌더링 프로세스에서 읽혀집니다. 렌더 플러그인에는 SceneGraphIterator에 대한 액세스 권한이 부여되어 장면 그래프와 해당 속성을 쿼리합니다. 그러나 이 장면은 변경할 수 없습니다. 실시간 렌더링 업데이트가 Katana 에서 전달되면 Geolib3 런타임을 업데이트할 수 없습니다. 이는 렌더 플러그인이 실시간 업데이트를 수신하더라도 SceneGraphIterator가 항상 원래 장면을 반환한다는 의미입니다. 따라서 SceneGraphIterator를 사용하여 추가 정보를 안전하게 얻을 수 없으므로 라이브 업데이트 속성에는 렌더 플러그인에 필요한 모든 정보가 포함되어야 합니다.
우리는 문제로 불편을 끼쳐 드려 죄송합니다
이유를 알려주세요