shader에서의 dword

반응형


shader에는 dword형이 존재하지 않는다.
하지만 우리가 입력스트림으로 칼라값을 설정해서 넘길때 보통 dword를 많이 사용한다.
struct VS_INPUT
{
float4 Pos  : POSITION;
float2 Tex  : TEXCOORD0;
};

그리고 argb로 해서 값을 넘긴다.
즉, 빨간색이라면 d3dcolor_argb(255, 255, 0, 0) 이런식으로 설정해 넘긴다.
이렇게 해도 shader 내부에서는 입력스트림일 경우 dword를 float4로 치환하여 사용하기 때문에 문제가 없다.

문제는 입력스트림이 아닌 전역상수로 넘기고자 할 때이다.
전역상수에 float4 vColor;이라고 설정하고 이곳에 SetValue로 값을 넘길때 dword를 넘기면 에러가 난다.
이 경우에는 직접 float4로 치환하여 넘겨야 한다.
dword의 경우 float4로 치환하고자 한다면 한바이트찍 잘라서 넣어주면 된다.

DWORD color = dwValue;
 float a = (float)(color>>24);
 color = color<<8;
 float r = (float)(color>>24);
 color = color<<8;
 float g = (float)(color>>24);
 color = color<<8;
 float b = (float)(color>>24);

그리고 255로 나누어 주면 shader에서 사용하는 색상값으로 표현할 수 있다.
D3DXVECTOR4(a/255.0f, r/255.0f, g/255.0f, b/255.0f);

그런데 문제는 dword 입력스트림이 아니라 상수로 넣어줄 경우에는 argb가 아니라
rgba로 넣어줘야 한다
는 것이다.

dword는 shader내부에서 알아서 rgba로 바꿔주지만 외부 상수는 직접 모두 바꾸어 줘야 한다.

TAGS.

Comments