Graphics Programming

AGAL 레지스터 인덱스 + 첨자 대신 단일 인덱스로 접근하기 본문

Season 1/플래시

AGAL 레지스터 인덱스 + 첨자 대신 단일 인덱스로 접근하기

minseoklee 2011. 10. 28. 21:46

종류에 무관하게 모든 레지스터는 네 실수 성분으로 이뤄지며 차례대로 xyzw로 접근한다.

ft0.x // 단편 셰이더 0번 임시 레지스터의 첫 번째 성분
fc2.z // 단편 셰이더 2번 상수 레지스터의 세 번째 성분

하지만 ft0 ~ ft3까지 모든 성분을 차례대로 쓴다던가 하는 상황에서는

ft0.x
ft0.y
ft0.z
ft0.w
ft1.x
...
ft3.w

이렇게 적기가 상당히 귀찮다. 이럴 때는 레지스터 번호에 신경 쓰지 말고

0번 레지스터의 xyzw 성분을 0 1 2 3번째 성분
1번 레지스터의 xyzw 성분을 4 5 6 7번째 성분
2번 레지스터의 xyzw 성분을 8 9 10 11번째 성분

으로 보고 셰이더 코드를 짜는 것이 더 편하다. 그런 데 쓸 함수는 간단하게 만들 수 있다.

var xyzw:Array = ["x", "y", "z", "w"]
function r(register:String, index:uint):String {
return register + uint(index/4) + "." + xyzw[index % 4]
}

간단하게 테스트해보면

for(var i:uint = 0 ; i < 14 ; i++) trace( r("fc", i) )

// 출력 결과
fc0.x
fc0.y
fc0.z
fc0.w
fc1.x
fc1.y
fc1.z
fc1.w
fc2.x
fc2.y
fc2.z
fc2.w
fc3.x
fc3.y

훨씬 편하다. 또한 셰이더에 강도라는 인자가 있어서 강도가 쎌 수록 더 많은 픽셀을 처리하기 위해 더 많은 레지스터를 쓸 경우에는 특정 픽셀에 대한 처리를 위해 fc2.y를 쓴 것이 강도가 달라지면 다른 성분을 써야 하는 경우가 발생하는데 그럴 때에도 수정이 쉽다.
Comments