본문 바로가기
Nuke/NDK

NDK - 기본 개념

by 르면가게 2024. 12. 7.

https://learn.foundry.com/nuke/developers/13.0/ndkdevguide/intro/oparchitecture.html#intro-fundamentalconcepts-nodesvsops

Nodes vs Operators (Ops)

NUKE는 이미지 데이터에 대해 작업을 수행하거나 결합하는 노드 그래프(Node Graph, 또는 DAG)를 구성하는 방식으로 작동합니다. 이 그래프에서 모든 객체는 노드로 표현됩니다.

주요 개념:

  • 노드(Node): 사용자가 볼 수 있는 노드 그래프의 블록입니다. 각 노드는 입력 화살표로 다른 노드와 연결되며, 출력 화살표를 통해 다른 노드의 입력에 연결됩니다. 실제 C++ 노드 클래스는 플러그인 작성자에게는 보이지 않으며, 이를 변경해도 플러그인에 영향을 주지 않습니다. 대신, 오퍼레이터(operator)에서 제공하는 메서드를 통해 정보를 가져오는 액세스 함수들이 있습니다.
  • 오퍼레이터(Operator, 또는 Op): 플러그인 작성자가 일반적으로 작성하는 클래스입니다. 오퍼레이터는 노드가 아니라 다른 오퍼레이터들과 연결됩니다. 각 노드는 적어도 하나의 오퍼레이터를 생성하며, 표면적으로는 노드와 오퍼레이터가 동일한 개념으로 보일 수 있습니다. 그러나 여러 이유로 노드가 여러 개의 오퍼레이터를 가질 수 있습니다:
    • 많은 오퍼레이터들이 내부적으로 오퍼레이터 트리를 구축하여 자신을 구현합니다.
    • 오퍼레이터는 시간 혼합, 입체 효과, 또는 이동 효과를 위해 여러 프레임 번호나 뷰에서 입력 오퍼레이터를 생성할 수 있습니다.
    • 클로닝(복제)은 "원본" 노드를 위해 여러 개의 오퍼레이터를 생성합니다.
    • 루핑(반복)은 각 반복을 위한 오퍼레이터를 생성합니다.
    • 리더 및 라이터는 파일 이름을 기반으로 파일 핸들러(FileHandler)를 생성합니다.

중요한 점:

NUKE는 각 노드에 대해 오퍼레이터를 생성하고 이를 통해 노드 그래프에서 노드의 특성을 결정합니다. 따라서 노드 그래프에 표시되는 노드는 항상 하나의 오퍼레이터와 연결되지만, 그 외에도 여러 오퍼레이터가 생성될 수 있습니다. 플러그인 작성자는 노드를 작성하는 것이 아니라 오퍼레이터를 작성하고 있다는 점을 명심해야 합니다. 사용자가 노드 그래프에서 보는 노드들이 NUKE가 데이터를 처리하기 위해 생성하는 오퍼레이터들을 반드시 반영하지는 않습니다.

Ops

NUKE에서 **노드(Node)**는 데이터를 처리하기 위해 Op를 필요로 합니다. 모든 데이터 처리 플러그인은 Op 클래스를 기반으로 작성됩니다.

Ops의 주요 역할:

  • Knobs 정의: Ops는 NUKE 노드 패널에서 사용자가 볼 수 있는 Knobs(파라미터)를 정의합니다.
  • 데이터 처리 인스턴스화: NUKE는 주어진 시간에 데이터를 처리하기 위해 Ops를 인스턴스화합니다.
  • 입력 수 정의: Ops는 노드에서 사용자가 볼 수 있는 입력의 개수를 정의합니다.
  • 입력 연결 허용: Ops는 어떤 입력이 이 Op와 연결될 수 있는지 정의합니다.
  • 입력 접근 방식 정의: Ops는 입력이 시간적으로 어떻게 접근되는지를 정의합니다.
  • 고유 해시 생성: Ops는 파라미터에 대해 고유한 해시 값을 반환하여 캐싱에 사용됩니다.

Op의 계층:

Op는 가상 기본 클래스(Virtual Base Class)로 간주해야 하며, NUKE에서 직접 사용되지는 않습니다. 대신, Iop(이미지 처리), GeoOp(기하학 처리), ParticleOp(입자 처리), DeepOp(딥 이미지 처리)와 같은 더 특화된 클래스를 상속받습니다. 이 소개에서는 Iop을 먼저 살펴보며 이미지 처리 과정에 대해 설명하고, 다른 섹션에서는 다른 하위 시스템에 대해 다룰 예정입니다.

Knobs

Knobs와 Op의 관계:

  • Knobs: NUKE에서 Knob은 노드에서 나타나는 파라미터를 의미합니다. Knob은 파라미터의 값을 저장하고, 애니메이션을 위한 키프레임과 곡선을 처리합니다.
  • Op와 Knobs: Op는 NUKE에 의해 쿼리되어 노드에 어떤 Knob이 있는지 알립니다. Op는 각 Knob에 대해 값을 저장할 수 있는 로컬 파라미터를 정의하며, 이는 특정 프레임(또는 컨텍스트)에서 고정(frozen)되어 이미지 처리를 위해 사용됩니다.

Op와 Knob의 동작:

  • Op 자체는 키프레임이나 애니메이션 곡선의 개념을 이해하지 못하지만, 해당 개념을 처리하는 Knob을 사용하여 이를 관리합니다.
  • 예를 들어, 하나의 부동 소수점 값을 가지는 Knob이 있는 Op는 다음과 같이 정의됩니다:
  • Float_Knob(f, &_value, “mygain”);
  • 여기서 &_value는 Op가 이미지 처리를 위해 사용하는 로컬 파라미터입니다. NUKE는 이를 통해 값을 추적하고, 해당 Knob에 대한 키프레임과 애니메이션을 처리합니다.

예시:

  • 예를 들어, frame 1에서 Knob의 값을 0으로 설정하고, frame 10에서 값을 10으로 설정하면:
    • NUKE는 frame 10에서 이 Op를 사용하여 이미지를 처리할 때, _value를 10으로 설정합니다.
    • 반면, frame 1을 렌더링할 때 _value를 0으로 설정하여 처리합니다.

이러한 방식으로 Knob은 각 프레임에 맞는 값을 설정하고, Op가 해당 값을 사용하여 이미지 처리 작업을 수행합니다.

Typical processing events

NUKE에서 이미지를 보기 위해 수행되는 typical한 처리 과정을 살펴보면, NUKE는 ‘pull’ 시스템 방식으로 작동합니다. 즉, 노드 트리의 맨 아래에 있는 노드가 데이터를 'pull'하고, 각 노드는 자신이 의존하는 입력에서 데이터를 다시 'pull'합니다. 이 방식은 노드 트리 상단에 있는 생성자 노드(예: Read, CheckerBoard 노드)에 도달할 때까지 계속해서 진행됩니다.

예시: CheckerBoard 노드 생성 및 출력 보기

  1. 사용자: CheckerBoard 노드를 생성합니다.
  2. NUKE: CheckerBoard Op의 인스턴스를 로드하고 생성합니다.
  3. NUKE: Op의 knobs() 함수를 호출하여 노드가 가지고 있는 파라미터를 확인합니다.
  4. NUKE: 컨트롤 패널을 열고 Knob 파라미터들을 사용자에게 표시합니다.
  5. (사용자는 이 단계에서 Knob 값을 설정할 수 있습니다.)
  6. 사용자: 사용자가 뷰어(Viewer) 또는 출력 노드(Write)를 연결하여 이미지를 생성합니다.
  7. NUKE: 현재 Node Graph와 현재 컨텍스트(프레임 번호)에 맞는 Op를 찾습니다. 만약 찾을 수 없다면, 새로운 Op를 생성합니다.
  8. NUKE: Op에서 Knob의 값을 주어진 컨텍스트에 맞게 저장(freeze)합니다.
  9. NUKE: 출력 Op는 자신의 입력에 대해 생성할 채널과 이미지 크기를 요청(validate)합니다. 각 Op는 재귀적으로 입력에 대해 이미지 크기와 채널을 요청하며, 입력이 더 이상 없을 때까지 반복됩니다.
  10. NUKE: 출력 Op는 모든 입력에 대해 필요한 이미지 크기와 채널을 요청(request)합니다. 각 Op는 재귀적으로 입력에 대해 필요한 이미지 크기와 채널을 요청하여 이미지를 생성합니다.
  11. NUKE: 출력 Op는 모든 입력에서 행(row)을 요청(engine)합니다. 각 Op는 입력에서 행을 요청하며, 입력이 더 이상 없을 때까지 반복됩니다. 각 행은 트리의 아래로 흐를 때마다 각 Op에 의해 수정됩니다.

이 과정에서 각 Op는 트리의 상단부터 하단까지 데이터를 요청하고, 최종적으로 출력 노드에 의해 처리된 이미지가 생성됩니다. 이 과정은 2D 아키텍처 섹션에서 더욱 자세히 설명됩니다.

결론적으로 Operators라는건 뭐야?

결론적으로, **Operators (Ops)**는 NUKE에서 이미지 처리 작업을 수행하는 기본 단위입니다. Ops는 노드가 수행하는 실제 이미지 연산을 담당하는 클래스입니다. 각 노드는 하나 이상의 Op를 포함하고 있으며, Op는 이미지 처리, 3D 처리, 입자 처리 등 다양한 작업을 처리하는 데 사용됩니다.

주요 특징:

  1. 이미지 처리의 핵심: Op는 노드에서 사용자에게 보여지는 Knob을 통해 파라미터를 관리하고, 그 파라미터에 따라 이미지를 처리합니다.
  2. 플러그인 작성: 플러그인 작성자는 Op를 작성하여 NUKE의 기능을 확장할 수 있습니다. 그러나 플러그인 작성자는 노드를 직접 작성하는 것이 아니라, Op 클래스를 상속받은 특화된 하위 클래스를 작성합니다.
  3. 입력/출력: Op는 다른 Op와 연결되어 입력 데이터를 받거나 출력 데이터를 생성합니다. 각 Op는 시간(프레임)과 입력/출력에 대해 제어를 하며, NUKE는 이를 통해 이미지 또는 영상을 생성하고 처리합니다.
  4. 동적 처리: Op는 NUKE가 처리할 때마다 동적으로 생성되어 데이터를 처리하며, 캐싱, 이미지 사이즈 조정, 채널 관리 등 다양한 작업을 수행합니다.

즉, Op는 NUKE에서 이미지를 처리하는 실질적인 작업 단위로, 각 노드는 이러한 Op들이 연결되어 이미지나 영상을 생성하는 작업을 처리하는 구조입니다.

'Nuke > NDK' 카테고리의 다른 글

NDK - 2D Architecture  (0) 2024.12.07
NDK - Versioning  (0) 2024.12.07
NDK - Building & Installing Plug-ins  (0) 2024.12.07
NDK - 용어  (1) 2024.12.07