본문 바로가기
Nuke/Blink Script

Blink Scripting 101 - C++의 For 루프

by 르면가게 2024. 12. 11.

C++의 For 루프 설명

For 루프는 특정 조건에 따라 작업을 여러 번 반복할 수 있도록 도와주는 C++의 기본 문법입니다. 이 문법을 사용하면 반복되는 코드를 일일이 작성하지 않아도 되고, 반복 횟수를 유연하게 제어할 수 있습니다.

For 루프의 기본 구조

for (int i = 0; i < value; i++) {
    // 반복할 코드

구성 요소:

  1. 초기화 (int i = 0): 루프가 시작될 때 실행되는 부분으로, 카운터 역할을 하는 변수를 설정합니다. 일반적으로 0부터 시작합니다.
  2. 조건 (i < value): 루프가 계속 실행될지 멈출지를 결정하는 조건입니다. 조건이 true인 동안 루프가 실행됩니다.
  3. 증가 (i++): 각 반복이 끝날 때 카운터 값을 업데이트합니다. 일반적으로 1씩 증가시킵니다.

이 세 가지가 결합되어 루프가 정해진 횟수만큼 실행됩니다.


예제: For 루프를 사용한 커널

아래는 for 루프를 활용한 기본 커널입니다:

kernel For_Loop : ImageComputationKernel <ePixelWise>
{
  Image<eRead,eAccessRandom,eEdgeClamped> src;                        // 입력 이미지
  Image<eWrite> dst;                                                  // 출력 이미지

  param:
    int increments;                                                   // 반복 횟수
    int amount;                                                       // 픽셀 이동 값

  void define(){
    defineParam(increments, "increments", 1);                         // 반복 횟수 기본값
    defineParam(amount, "amount", 50);                                // 이동 값 기본값
  }

  void process(int2 pos) {
    int total = 0;                                                    // 초기 합계 값

    for (int i = 0; i < increments; i++) {                            // For 루프 시작
      total += amount;                                                // 각 반복에서 이동 값을 추가
    }

    dst() = src((pos.x + total), pos.y);                              // x축 위치를 이동시켜 출력
  }
};

이 커널의 동작 원리

  • 매개변수(increments, amount):
    • increments는 루프가 몇 번 반복될지를 설정합니다.
    • amount는 각 반복마다 추가될 픽셀 값을 의미합니다.
  • 로컬 변수(total):
    • 루프 내에서 합계 값을 저장하는 변수로, 처음에는 0으로 초기화됩니다.
    • 루프가 실행될 때마다 amount 값을 더합니다.

예제 실행

  1. increments = 1, amount = 50일 경우:
    • 루프가 한 번 실행되며, total은 50이 됩니다.
    • 결과적으로 이미지의 x 위치는 50픽셀 이동됩니다.
  2. increments = 2, amount = 25일 경우:
    • 루프가 두 번 실행되며, total은 25 + 25 = 50이 됩니다.
    • 결과적으로 이미지의 x 위치는 50픽셀 이동됩니다.

For 루프의 변형 예제

아래는 루프 시작 조건(trigger)을 매개변수화한 커널입니다:

kernel For_Loop2 : ImageComputationKernel <ePixelWise>
{
  Image<eRead,eAccessRandom,eEdgeClamped> src;                        // 입력 이미지
  Image<eWrite> dst;                                                  // 출력 이미지

  param:
    int trigger;                                                      // 루프 시작 조건
    int increments;                                                   // 반복 횟수
    int amount;                                                       // 이동 값

  void define(){
    defineParam(trigger, "trigger", 10);                              // 루프 시작 조건 기본값
    defineParam(increments, "increments", 2);                         // 반복 횟수 기본값
    defineParam(amount, "amount", 100);                               // 이동 값 기본값
  }

  void process(int2 pos) {
    int total = 0;                                                    // 초기 합계 값

    for (int i = trigger; i <= increments; i++) {                     // trigger로 시작하는 루프
      total += amount;                                                // 각 반복에서 이동 값을 추가
    }

    dst() = src((pos.x + total), pos.y);                              // x축 위치를 이동시켜 출력
  }
};

주요 변경 사항

  • trigger 매개변수: 루프 시작 값을 설정합니다.
    • 예를 들어, trigger = 10이고 increments = 2이면, 조건이 충족되지 않아 루프가 실행되지 않습니다.
    • 반대로 increments >= trigger일 경우 루프가 실행됩니다.

결과

  • trigger = 10, increments = 2일 때:
    • 루프가 실행되지 않으며, 이미지가 이동하지 않습니다.
  • trigger = 2, increments = 10일 때:
    • 루프가 실행되며, 각 반복에서 amount(예: 100)를 합산하여 총 이동 값이 계산됩니다.

요약

  • For 루프는 조건을 설정해 반복 작업을 수행하는 강력한 도구입니다.
  • 루프 매개변수를 통해 실행 조건과 반복 횟수를 유연하게 제어할 수 있습니다.
  • 코드에서 반복 작업을 줄이고 효율적으로 작성할 수 있도록 도와줍니다.