'D3DCOLOR'에 해당되는 글 1건
- 2010.05.12 Direct3D에서의 Color값 2
다이렉트에서는 크게 두가지의 컬러값이 있어요.
하나는 D3DCOLOR와 또 하나는 D3DCOLORVALUE입니다.(여기서 D3DXCOLOR는 논외대상입니다)
각각의 원형은..
typedef DWORD D3DCOLOR; // 여기서 DWORD는 unsigned long타입입니다.
typedef struct _D3DCOLORVALUE {
float r;
float g;
float b;
float a;
} D3DCOLORVALUE;
float r;
float g;
float b;
float a;
} D3DCOLORVALUE;
여기서 D3DCOLOR는 A R G B 순으로 각각 1바이트씩 4바이트 데이터타입입니다. 따라서 각각은 0~255의 값을 갖게 되어있겠죠. 16진수로 나타내면 최대 0xffffffff가 되겠습니다. 0xffff0000하면.. 알파값을 최대로 갖는(불투명) 빨간색이 되겠죠.
D3DCOLORVALUE는 D3DCOLOR의 A R G B값을 각각 255로 나눈 값이라고 생각하시면 되겠습니다. 그럼 각각 0~1의 값을 갖게 되는데, 왜 이런 부분이 있느냐하고 의아해 하실 수 있습니다.
예를 하나 들어보겠습니다. 바로 이전에 포스팅했던 텍스쳐블렌딩에 대해서요.
텍스쳐 블렌딩 중, D3DTOP_MODULATE값인 경우는 두 컬러값을 곱해서 결과값을 매핑하게 됩니다.
( SRGBA= Arg1 × Arg2, DX 도움말 발췌)
빨간색의 경우 어느한쪽은 255이고, 어느한쪽은 그의 반인 127이라면.. 그대로 곱해버리면 32385가 되어버리겠죠. 32385란 빨간색값이 있었나요? 그리하여 각각이 0~1값을 갖도록 정규화되어진 것입니다.
255는 1이구요. 127은 약 0.5가 되죠. 이 둘을 곱하면 0.5가 됩니다. 즉, red값은 127이 됩니다. 나머지 컬러값도 비슷한 방식으로 계산되겠죠?
이 부분은 알파블렌딩의 경우도 마찬가지입니다. 흔히 말하는 알파블렌딩 방식은 다음과 같죠.
src = color*alpha
dest = color*(1-alpha)
final color = src+dest
dest = color*(1-alpha)
final color = src+dest
여기서도 alpha값과 컬러값은 0~1의 값을 갖게됩니다. 알파값이 76(30%)이라면, 소스에서는 현재 컬러값 RGB값에 각각 0.3를 곱해주고 대상 컬러값엔 0.7를 각각 곱해서 블렌딩하게 되겠죠. 알파값이 255(100%)라면 어떨까요? 상상해 보시기 바랍니다. 어쨌든, D3DCOLORVALUE값으로 계산되어진단 얘기입니다. 그 이유 때문에선지, D3DMATERIAL9의 각 변수들은 아래와 같이 D3DCOLORVALUE값을 데이터타입으로 갖습니다.
typedef struct D3DMATERIAL9 {
D3DCOLORVALUE Diffuse;
D3DCOLORVALUE Ambient;
D3DCOLORVALUE Specular;
D3DCOLORVALUE Emissive;
float Power;
} D3DMATERIAL9, *LPD3DMATERIAL9;
D3DCOLORVALUE Diffuse;
D3DCOLORVALUE Ambient;
D3DCOLORVALUE Specular;
D3DCOLORVALUE Emissive;
float Power;
} D3DMATERIAL9, *LPD3DMATERIAL9;
'게임 > Direct3D' 카테고리의 다른 글
IDirect3DDevice9::SetTextureStageState 설계방식에 대한 실험 (1) | 2010.05.12 |
---|