요즘 HLSL을 가지고 Pixel Shader를 만들고 있다. 따라서 여기서 얘기하는 경험은 HLSL로 된 *.fx 파일을 컴파일 할 때 적용되는 얘기이다. 셰이더 어셈블리 명령을 직접 써서 만드는 일은 전혀 해보지 않아서 얼마나 관련성이 있을지 모르겠다.
Silverlight 3와 WPF(.NET 3.5 SP1)에서는 Shader Model 2의 Pixel Shader(ps_2_0)를 지원한다.
Pixel Shader 2.0에서는 64개의 산술 instruction만을 사용할 수 있다. 문제는 64개를 넘어서 컴파일이 안 될 때만 인스트럭션 개수를 알려준다는 것. 기본적인 사용법만 배운 상태에서 한참 만들다가 "님, 인스트럭션 개수 초과했어염. 65개임."하는 에러 메시지를 받았을 때 어찌나 황당하던지.
인스트럭션 개수를 알 수 있는 방법을 찾아 헤매다가 발견한 것이 셰이더 어셈블리 파일을 만들어 내는 옵션이다. *.fx 파일을 fxc.exe로 컴파일할 때 /Fc 옵션을 사용하면 어셈블리 파일을 출력해준다. 여기에는 컴파일 결과물의 인스트럭션 개수가 표시되기 때문에 작업할 때 아주 유용하다. 만세! 인스트럭션 개수를 알 수 있는 다른 방법은 아직 찾지 못했다.
인스트럭션 개수를 알 수 있는 방법이 생기니 인스트럭션 개수 줄이는 삽질도 이제 좀 할 맛이 난다. 경험상 현재까지 작업중에 인스트럭션 줄이는데 제일 도움이 되는 것은 똑같은 산술 연산을 벡터 연산 하나로 합치는 거였다.
가령 이런 코드보다
float c1 = Const1 - color.r;
float c2 = Const2 - color.g;
float c3 = Const3 - color.b;
이런 코드의 인스트럭션 개수가 적었다.float c2 = Const2 - color.g;
float c3 = Const3 - color.b;
float4 c4 = {Const1, Const2, Const3, 0.0f};
float4 c = c4 - color;
float4 c = c4 - color;