https://www.youtube.com/watch?v=xJZ_9EkdyAI
Blink Script란?
- 공식 정의: The Foundry의 Blink 참조 가이드에 따르면, Blink Script는 신속한 이미지 처리를 위해 설계된 C++ 유사 언어로, 표준 C++ 문법을 사용하며 몇 가지 키워드 변경 사항이 포함되어 있습니다.
- 아티스트의 시각에서 본 Blink Script: Blink Script는 픽셀에 직접 접근해 값을 조작할 수 있게 해주는 다리 역할을 합니다. Nuke에서 Python을 사용할 때는 주로 노드 그래프 탐색, 파일 경로 처리, 노브 설정 변경 등의 작업을 하게 되며, 실제 픽셀 값에 영향을 주는 경우는 거의 없습니다. 반면, Nuke의 Expression 노드는 픽셀 값을 바로 조정하는 데 유용하지만 반복문을 사용할 수 없거나 많은 변수를 정의할 수 없다는 제한이 있어, 프로그래밍적으로 제어하는 데 한계가 있습니다.
Blink Script의 활용 예
- 다양한 툴에서 Blink Script를 사용하여, 다른 방식으로는 어려운 픽셀 수준의 조작을 가능하게 합니다.
예제 도구
- God Rays Projector:
- 기능: 두 개의 카메라를 사용해, 하나는 뷰어로 보고 다른 하나는 프로젝터로 사용하여 특정 영역에 God Rays(빛줄기) 효과를 생성합니다.
- 설명: 이 도구는 입력 이미지의 여러 버전을 생성한 뒤, 이들을 평균화하여 박스 형태의 안개 효과를 만듭니다. 두 카메라의 위치, 회전, 시야각 정보를 활용한 수학적 변환으로 이미지가 생성됩니다.
- 활용: 반복적으로 각 단계에서 픽셀을 처리해야 하기 때문에 Blink Script가 사용되었습니다.
- Chromatic Blink:
- 기능: 반복적으로 ST 맵을 적용하여 멋진 변형 효과를 생성합니다.
- 설명: 두 개의 ST 맵을 이용해 들어오는 부분과 나가는 부분을 각각 조정할 수 있어 독특한 효과를 만듭니다. Blink Script 덕분에 GPU를 활용하여 매우 빠르게 결과를 얻을 수 있습니다.
- 활용: GPU를 사용한 병렬 처리가 가능해져 Blink Script로 높은 속도와 즉각적인 반응성을 확보했습니다.
- Radial Dilate:
- 기능: Nuke의 기본적인 Dilate 노드를 원형 필터로 적용하여 이미지를 안팎으로 확장하는 효과를 만듭니다.
- 설명: 기본 Dilate는 사각형 필터를 사용하는 반면, Radial Dilate는 원형 필터를 사용하여 더 자연스러운 확장 효과를 제공합니다.
Blink Script의 장점
Blink Script를 사용하면 픽셀 단위의 조작이 가능해져 다양한 효과를 직접 구현할 수 있습니다. GPU의 병렬 처리를 활용할 수 있어 속도와 효율성 또한 높아지며, "생각할 수 있다면 Blink로 구현할 수 있다"는 점에서 매우 강력합니다.
이제 Blink Script 노드를 사용하여 실제 구현을 시작해보자는 취지로 이어집니다.
BlinkScript 노드의 기본 사용법과 초기 설정
BlinkScript 노드를 이용하여 자체 도구를 만드는 방법을 단계별로 설명한 내용입니다. 아래는 기본적인 BlinkScript 노드를 설정하고 사용하기 위한 과정 요약입니다.
kernel SaturationKernel : ImageComputationKernel<ePixelWise>
{
Image<eRead, eAccessPoint, eEdgeClamped> src; // the input image
Image<eWrite> dst; // the output image
param:
float saturation; // This parameter is made available to the user.
local:
float3 coefficients; // This local variable is not exposed to the user.
// In define(), parameters can be given labels and default values.
void define() {
defineParam(saturation, "Saturation", 1.2f);
}
// The init() function is run before any calls to process().
// Local variables can be initialized here.
void init() {
// Initialise coefficients according to rec. 709 standard.
coefficients.x = 0.2126f;
coefficients.y = 0.7152f;
coefficients.z = 0.0722f;
}
void process() {
// Read the input image
SampleType(src) input = src();
// Isolate the RGB components
float3 srcPixel(input.x, input.y, input.z);
// Calculate luma
float luma = srcPixel.x * coefficients.x
+ srcPixel.y * coefficients.y
+ srcPixel.z * coefficients.z;
// Apply saturation
float3 saturatedPixel = (srcPixel - luma) * saturation + luma;
// Write the result to the output image
dst() = float4(saturatedPixel.x, saturatedPixel.y, saturatedPixel.z, input.w);
}
};
- BlinkScript 노드 추가하기:
- Blink Script 노드를 생성합니다. 이 노드의 주요 인터페이스는 Kernel Source 탭으로, 이곳에서 모든 코드를 작성합니다. 기본적으로는 간단한 색상 포화(saturation) 커널이 제공됩니다.
- 기본 설정 수정:
- 예제에서는 “Saturation Kernel”이 기본 설정으로 되어 있지만, 이를 빈 커널(Blank Kernel)으로 바꾸고 시작합니다.
- pixel wise와 component wise 두 가지 옵션 중 pixel wise가 기본 설정으로 적합합니다. 이는 픽셀 단위로 작업하되, 각 채널을 개별적으로 조작할 수 있는 방식입니다.
- 커널 구조 파악하기:
- 코드가 기본적으로 여러 섹션으로 나뉘어져 있으며, 불필요한 부분은 제거하여 간단한 템플릿을 만듭니다.
- Parameters: 사용자 정의 슬라이더나 설정을 추가하는 부분. 초기 설정에서는 삭제합니다.
- Local: 내부에서만 사용하는 변수 정의 부분. 초기에는 필요 없으므로 삭제합니다.
- Define: 파라미터의 이름과 기본값을 정의하는 곳. 초기에는 사용하지 않으므로 삭제합니다.
- Init: 초기화가 필요한 경우 사용되는 섹션. 필요 없으므로 삭제합니다.
- Process: 실제로 이미지 처리를 수행하는 섹션입니다. 이곳에 대부분의 코드를 작성하게 됩니다.
- 코드가 기본적으로 여러 섹션으로 나뉘어져 있으며, 불필요한 부분은 제거하여 간단한 템플릿을 만듭니다.
- 기본 BlinkScript 코드 작성:
- 실제 코드 부분에서는 출력 이미지가 입력 이미지와 동일하게 설정되도록 코드를 작성합니다.
- DST(x, y) = SRC(x, y); 구문을 통해 입력과 출력을 동일하게 만들어 초기 상태를 설정합니다.
- Recompile 버튼을 눌러 컴파일하면, BlinkScript가 Blank Kernel로 작동하게 됩니다.
- 툴셋으로 저장하기:
- 기본 BlinkScript 설정을 툴셋으로 저장하여, 이후 필요할 때마다 이 초기 상태를 불러와 사용할 수 있도록 합니다.
'Nuke > Blink Script' 카테고리의 다른 글
blink kernels (4) (0) | 2024.12.08 |
---|---|
blink kernels (3) (0) | 2024.12.08 |
blink kernels (2) (0) | 2024.12.08 |
blink kernels (1) (0) | 2024.12.08 |
Blink Script (2) (0) | 2024.12.08 |