Presentation is loading. Please wait.

Presentation is loading. Please wait.

제4장 컬 러(COLOR) 컬러 표현 Direct3D는 RGB 세 성분을 이용해 컬러 표현

Similar presentations


Presentation on theme: "제4장 컬 러(COLOR) 컬러 표현 Direct3D는 RGB 세 성분을 이용해 컬러 표현"— Presentation transcript:

1 제4장 컬 러(COLOR) 컬러 표현 Direct3D는 RGB 세 성분을 이용해 컬러 표현
컬러를 지정하는 첫 번째 방법 32 비트 DWORD 형으로 정의된 D3DCOLOR 형 네 개의 8비트 섹션으로 나누어짐 각각의 섹션은 컬러 성분의 진하기를 저장 32-비트 알 파 적 색 녹 색 청 색 2009-1학기 컴퓨터게임(DirectX)

2 D3DCOLOR 형 저장하기 위해서는 비트연산 필요 D3DCOLOR_ARGB 라는 매크로 사용
각각의 컬러 성분이 하나의 바이트를 이용 컬러의 범위는 0~255사이가 됨 0에 가까운 값은 낮은 진하기를 나타냄 255에 가까운 값은 높은 진하기를 나타냄 D3DCOLOR 형 저장하기 위해서는 비트연산 필요 D3DCOLOR_ARGB 라는 매크로 사용 D3DCOLOR brightRed = D3DCOLOR_ARGB(255,255,0,0); D3DCOLOR someColor = D3DCOLOR_ARGB(255,144,87,210); 2009-1학기 컴퓨터게임(DirectX)

3 선택적으로 이용할 수 있는 D3DCOLOR_XRGB 매크로는 알파 인자를 받지 않음. 알파를 0xff(255)로 지정한다.
#define D3DCOLOR_XRGB(r,g,b) D3DCOLOR_ARGB(0xff,r,g,b) 컬러를 지정하는 두 번째 방법 D3DCOLORVALUE 구조체 이용하는 것 각각의 컬러 성분에 부동 소수점 값을 이용 범위는 0 ~ 1사이이며 0이 가장 낮은 진하기, 1이 가장 높은 진하기 이다. 2009-1학기 컴퓨터게임(DirectX)

4 typedef struct _D3DCOLORVALUE{ float r; float g; float b;
이외에도 D3XCOLOR 구조체가 있는데, D3DCOLORVALUE 와 동일한 데이터 멤버를 포함하지만 컬러의 관리를 위한 몇 가지 생성자 및 오버로드된 연산자를 포함. 2009-1학기 컴퓨터게임(DirectX)

5 D3DXCOLOR 구조체 typedef struct D3DXCOLOR { #ifdef __cplusplus public:
D3DXCOLOR(DWORD argb); D3DXCOLOR(CONST FLOAT *); D3DXCOLOR(CONST D3DFLOAT16 *); D3DXCOLOR(CONST D3DCOLORVALUE&); D3DXCOLOR(FLOAT r, FLOAT g, FLOAT b, FLOAT a); // 형 변환 operator DWORD () const; operator FLOAT* (); operator CONST FLOAT* () const; 2009-1학기 컴퓨터게임(DirectX)

6 operator D3DCOLORVALUE* (); operator CONST D3DCOLORVALUE* () const;
// 할당 연산자 D3DXCOLOR& operator += (CONST D3DXCOLOR&); D3DXCOLOR& operator -= (CONST D3DXCOLOR&); D3DXCOLOR& operator *= (FLAOT); D3DXCOLOR& operator /= (FLAOT); 2009-1학기 컴퓨터게임(DirectX)

7 D3DXCOLOR operator + () const; D3DXCOLOR operator – () const;
// 단항 연산자 D3DXCOLOR operator + () const; D3DXCOLOR operator – () const; // 이항 연산자 D3DXCOLOR operator + (CONST D3DXCOLOR&) const; D3DXCOLOR operator - (CONST D3DXCOLOR&) const; D3DXCOLOR operator * (FLAOT) const; D3DXCOLOR operator / (FLOAT) const; friend D3DXCOLOR operator* (FLOAT, CONST D3DXCOLOR&); BOOL operator == (CONST D3DXCOLOR&) const; BOOL operator != (CONST D3DXCOLOR&) const; 2009-1학기 컴퓨터게임(DirectX)

8 } D3DXCOLOR, *LPD3DXCOLOR;
#endif // __cplusplus FLOAT r, g, b, a; } D3DXCOLOR, *LPD3DXCOLOR; D3DCOLORVALUE 와 D3DXCOLOR 구조체는 모두 네 개의 부동 소수점 성분을 가진다. 다른 벡터와 같이 더하고, 빼고 크기 변형 가능 내적, 외적 의미가 없으며, 성분 단위의 곱만 의미 D3DXCOLOR 클래스의 곱은 성분 단위의 곱 (c1, c2, c3, c4)  (k1, k2, k3 , k4) = (c1*k1, c2*k2, c3*k3, c4*k4); 2009-1학기 컴퓨터게임(DirectX)

9 const D3DXCOLOR WHITE( D3DCOLOR_XRGB(255, 255, 255) );
d3dutility.h 파일 갱신 namespace d3d{ const D3DXCOLOR WHITE( D3DCOLOR_XRGB(255, 255, 255) ); const D3DXCOLOR BLACK( D3DCOLOR_XRGB( 0, 0, 0) ); const D3DXCOLOR RED( D3DCOLOR_XRGB(255, 0, 0) ); const D3DXCOLOR GREEN( D3DCOLOR_XRGB( 0, 255, 0) ); const D3DXCOLOR BLUE( D3DCOLOR_XRGB( 0, 0, 255) ); const D3DXCOLOR YELLOW( D3DCOLOR_XRGB(255, 255, 0) ); const D3DXCOLOR CYAN( D3DCOLOR_XRGB( 0, 255, 255) ); const D3DXCOLOR MAGENTA( D3DCOLOR_XRGB(255, 0, 255) ); } 2009-1학기 컴퓨터게임(DirectX)

10 버텍스 컬러 기본형의 컬러는 이를 구성하는 버텍스의 컬러에 따라 결정된다. 버텍스 데이터 구조체에 컬러 멤버를 추가해야 함
버텍스 컬러를 지정하는데 32비트 필요 D3DCOLORVALUE 형을 사용할 수 없다. struct ColorVertex { float _x, _y, _z; D3DCOLOR _color; static const DWORD FVF; } Const DWORD ColorVertex::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE; 2009-1학기 컴퓨터게임(DirectX)

11 셰 이 딩 셰이딩은 레스터라이즈 과정 중에 이루어짐
기본형을 구성하는 픽셀 컬러를 계산하는 데 버텍스 컬러가 이용되는 방식 결정 플랫 셰이딩(Flat shading) 그라우드 셰이딩(Gouraud shading) 플랫 셰이딩 상에서는 기본형의 첫 번째 버텍스에 지정된 컬러를 이용해 기본형의 픽셀 채운다. 2009-1학기 컴퓨터게임(DirectX)

12 예를 들어 세 개의 버텍스로 이루어진 삼각형이 있다면 첫 번째 버텍스 컬러는 빨간색이다.
예를 들어 세 개의 버텍스로 이루어진 삼각형이 있다면 첫 번째 버텍스 컬러는 빨간색이다. 플랫 셰이딩 상에서는 두 번째와 세 번째 버텍스는 무시되어 삼각형의 컬러는 빨간색이 됨 ColorVertex t[3]; T[0]._color = D3DCOLOR_XRGB(255, 0, 0); T[1]._color = D3DCOLOR_XRGB(0, 255, 0); T[2]._color = D3DCOLOR_XRGB(0, 0, 255); 2009-1학기 컴퓨터게임(DirectX)

13 기본형 면을 따라 보간된 컬러가 버텍스에 입혀짐 셰이딩 모드 지정 // 플랫 셰이딩 모드 지정
그라우드 셰이딩은 부드러운 셰이딩 방식 기본형 면을 따라 보간된 컬러가 버텍스에 입혀짐 셰이딩 모드 지정 // 플랫 셰이딩 모드 지정 Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); // 그라우드 셰이딩 모드 지정 Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); 2009-1학기 컴퓨터게임(DirectX)

14 예제 애플리케이션 컬러를 입힌 삼각형(플랫 셰이딩과 그라우드 쉐이딩) 2009-1학기 컴퓨터게임(DirectX)

15 IDirect3DDevice9* Device = 0; const int Width = 640;
#include "d3dUtility.h" IDirect3DDevice9* Device = 0; const int Width = 640; const int Height = 480; D3DXMATRIX WorldMatrix; IDirect3DVertexBuffer9* Triangle = 0; struct ColorVertex{ ColorVertex(){} ColorVertex(float x, float y, float z, D3DCOLOR c){ _x = x; _y = y; _z = z; _color = c; } 2009-1학기 컴퓨터게임(DirectX)

16 static const DWORD FVF; };
float _x, _y, _z; D3DCOLOR _color; static const DWORD FVF; }; const DWORD ColorVertex::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE; bool Setup() { // 버텍스 버퍼를 만든다. Device->CreateVertexBuffer( 3 * sizeof(ColorVertex), D3DUSAGE_WRITEONLY, ColorVertex::FVF, D3DPOOL_MANAGED, &Triangle, 0); // 삼각형 데이터로 버퍼를 채운다. ColorVertex* v; Triangle->Lock(0, 0, (void**)&v, 0); // 삼각형 버텍스 데이터를 보관할 버텍스 버퍼 2009-1학기 컴퓨터게임(DirectX)

17 v[0] = ColorVertex(-1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(255, 0, 0));
Triangle->Unlock(); // 투영 매트릭스를 지정한다. D3DXMATRIX proj; D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI * 0.5f, (float)Width / (float)Height, 1.0f, f); Device->SetTransform(D3DTS_PROJECTION, &proj); // 렌더 상태를 지정한다. Device->SetRenderState(D3DRS_LIGHTING, false); return true; } 2009-1학기 컴퓨터게임(DirectX)

18 d3d::Release<IDirect3DVertexBuffer9*>(Triangle); }
void Cleanup() { d3d::Release<IDirect3DVertexBuffer9*>(Triangle); } bool Display(float timeDelta) if( Device ) Device->Clear(0, 0, D3DCLEAR_TARGET |D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); Device->BeginScene(); Device->SetFVF(ColorVertex::FVF); Device->SetStreamSource(0, Triangle, 0, sizeof(ColorVertex)); 2009-1학기 컴퓨터게임(DirectX)

19 // 플랫 셰이딩으로 화면 왼쪽에 삼각형을 그린다.
D3DXMatrixTranslation(&WorldMatrix, -1.25f, 0.0f, 0.0f); Device->SetTransform(D3DTS_WORLD, &WorldMatrix); Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); D3DXMatrixTranslation(&WorldMatrix, 1.25f, 0.0f, 0.0f); // 그라우드 셰이딩으로 화면 오른쪽에 삼각형을 그린다. Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); Device->EndScene(); Device->Present(0, 0, 0, 0); } return true; 2009-1학기 컴퓨터게임(DirectX)

20 2009-1학기 컴퓨터게임(DirectX)


Download ppt "제4장 컬 러(COLOR) 컬러 표현 Direct3D는 RGB 세 성분을 이용해 컬러 표현"

Similar presentations


Ads by Google