픽셀벤더(Pixel Bender)에 대한 나름 간단 정리

2011/09/22 14:56

 
플래시에서 픽셀벤더(Pixel Bender)를 사용할 때 기억해둬야 할 것을 의미없이 나열 정리를 한 것이다. 


플래시에서 사용하는 픽셀벤더
- 픽셀벤더를 만들어 컴파일된 pbj는 플래시에서 엠베드하거나 동적으로 로드할 수 있다. 
- 픽셀벤더의 문법은 GLSL(OpenGL Shading Language) 기반이다. 
- 픽셀벤더 그래프(Pixel Bender Graph)는 개개의 픽셀 프로세싱 운영  위한 XML 언어이다. 플래시에서는 지원되지 않는다. 
- 픽셀벤더의 소스는 PBK 파일로 작성되며 PBJ로 컴파일 된다. 이것을 플래시에서 동적으로 로드하거나 엠베드해서 사용할 수 있다. 
- 픽셀벤더는 GPU에서 동작하도록 디자인 되었지만 플래시에서는 CPU에서 동작하도록 제한되어 있다. 
- 픽셀벤더는 픽셀벤더 툴킷(Pixel Bender ToolKit)이라는 도구를 사용해 개발할 수 있다. 플래시 빌더에서 개발한다면 PBDT 플러그인을 설치해 사용하면 훨씬 쉽게 개발할 수 있다. 
- 플래시에서는 동적으로 로드하거나 엠베드된 pbj를 Shader 클래스로 랩핑해서 사용한다.
- 플래시에서 픽셀벤더의 용도는 빠른 Filters, Fills, Blend modes,Calculation에 있다. 
- 용도를 Fill로 하는 경우 beginShaderFill을 이용해 Shader를 적용할 수 있다.
- 용도를 Filter로 하는 경우 ShaderFilter를 통해 디스플레이 객체에 filters에 적용시킬 수 있다. 이 경우 픽셀벤더로 전달되는 입력값은 자동적으로 디스플레이 객체의 비트맵 데이터가 된다. 즉, 따로 입력을 설정할 필요가 없다.
- 용도를 Blend mode로 하면 디스플레이 객체의 blendShader 속성에 적용할 수 있다. 
- 용도를 Calculation으로 하면 수학적인 계산에 응용할 수 있다. 
- ShaderJob을 사용하면 별도의 스레드 위에 Shader를 구동시킬 수 있다. 입력과 출력을 꼭 비트맵으로 지정할 필요가 없다. Vector나 ByteArray값을 입출력으로 만들 수 있다.
- ShaderJob은 한번에 두개 이상 독립적으로 구동될 수 없다. ShaderJob을 여러개 만들어 start(false)를 하더라도 첫번째 ShaderJob이 모두 끝난 다음에야 다음 ShaderJob을 구동할 수 있다.  
- 다양한 파라미터를 입력받을 수 있다. float1, float2, float3, float4, ...등 하지만 Array는 받을 수 없다. 
- 입력은 3개까지 지원한다., 출력은 무조건 1개이다.
- 입력 타입은 image1, image2, image3, image4 로 총 4개 채널까지 커버한다. 
- 입력으로 들어가는 n x m의 크기 제약은 ... 이다.
- 입력은 image# 형태이기 때문에 이미지가 아닌 Vector나 ByteArray를 입력하는 경우에는 이미지의 폭과 높이에 맞는 데이터가 들어오도록 맞춰야한다. 즉 데이터 수 = n x m (n, m은 정수)이어야 한다. n, m의 크기는 제약이 있기 때문에 m을 1로 정해버리고 하면 런타임 에러가 날 수 있으므로 주의하자. 
- 플래시에서 이미지가 입력값인 경우 각 채널당 8비트만 지원한다. 하지만 입력이 ByteArray나 Vector인 경우에는 각 채널당 32비트를 그대로 지원한다. 이런게 다 자동으로 해준다.. 완전 편리 
- 플래시에서는 1x1 정방형의 픽셀만 사용한다. pixelSize() 함수는 항상 (1.0, 1.0)만 반환하여, pixelAspectRatio()는 항상 1.0만 반환한다. 
- 출력은 무조건 1개이며 pixel3, pixel4와 같이 3, 4개 채널로 제한된다. pixel1, pixel2와 같은 채널을 출력으로 설정할 수 없다. 
- 플래시에서는 사용되는 픽셀벤더는 for 문을 사용할 수 없다.
- 픽셀벤더 커널에는 반드시 evaluatePixel() 함수가 정의되어야 한다. 
- Flash에서 사용하는 경우 Region 함수 및 커스텀 지원 함수나 라이브러리를 사용할 수 없다. 
- if/else을 사용할 수 있다. 하지만 이 방법은 픽셀단위로 계산하는 픽셀벤더 특성상 매우 느리다.
- evaluatePixel() 밖에 const지정을 할 수 있습니다. 하지만 느리므로 지양해야 한다.
- 플래시에서는 dependant를 지정할 수 없습니다. 
- evaluatePixel()는 출력크기 기준으로 반복된다. ShaderJob을 사용하는 경우 따로 출력크기를 설정할 수 있는데 이것은 ByteArray나 Vector로 출력해야하는 경우로 제한된다. 
- 출력의 크기로 반복되기 때문에 입력의 크기와 다른 경우 플래시에서 for문을 지원하지 않으므로 데이터 처리가 불가능하다. 
- 다양한 수학함수를 사용할 수 있다. sin, cos, tan, asin, acos, atan, exp, log, log2, inverseSqrt, sign, floor, ceil, fract, pow, sqrt, fract, mod, min, max, step, clamp, mix, smoothstep, 등 
- 다양한 지오메트릭 함수를 지원한다. length, distance, dot, cross, normalize, mztrixCompMult, lessThan, lessThanEqual,  greaterThan, greaterThanEqual, equal, notEqual, any, all, not 등 
- 다양한 오퍼레이터를 지원한다. +, -, *, +=, -=, =, &&, ||, ^^, ! , <, >, <=, >=, !=, ?:
- Vector, matrix를 접근시 [index] 형태로 하나의 요소에 접근할 수 있다. 플래시에서는 Array는 지원하지 않는다. 
- 샘플링 함수를 통해 각 픽셀정보를 얻어올 수 있다. sample(), sampleLinear(), sampleNearest() 등 
- pixel4의 경우 pixel[0]나 pixel.r, pixel.x, pixel.s와 동일하다. pixel.rgb, pixel.xwzw, pixel.stuv 임을 기억하자. 
- 픽셀벤더의 사용법을 익혀두면 픽셀벤더3D 학습시에도 도움이 된다.  


픽셀벤더 처음 공부할때 반드시 볼 내용
픽셀벤더에 대한 학습이 필요할 때 아래 링크는 꽤 유용할 것이다. 

- 픽셀벤더 개발자 센터 
저작자 표시 비영리 동일 조건 변경 허락

Adobe Pixel Bender , , , , , , , ,