블로그 이미지
대갈장군

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2008. 2. 6. 05:12 프로그래밍/DirectX
이 내용은 www.directxtutorial.com 사이트의 내용을 번역한 하여 참조하였습니다.

보통 3차원 물체는 삼각형들로 구성이 되고 이 삼각형은 Vertex로 구성이 된다.

Vertex는 사실 "3차원 공간의 어떤 한 점에 대한 위치 정보 + 속성 정보" 라고 정의 가능하다.

OpneGL에서도 시계 방향이었는지 기억은 안나지만 DX에서는 삼각형 정의를 위해서 3개의 점이 시계 방향으로 정의 되어야 한다고 되어 있다.

Image 3.5 - A Triangle Built From Vertices

Image 3.5 - A Triangle Built From Vertices

뭐 아시다시피 그래서 Primitives가 정의가능한데 바로 도형인 셈이다. 하지만 딱 도형이라고 말하기는 그렇고 (왜냐면 선, 점들도 들어가니까) 그냥 일련의 Vertex의 모임인데 Primitives라고 기억하는 것이 더 좋을 듯 하다. 총 6가지의 Primitives가 있는데 다음과 같다.

1.  Point Lists
화면상에서 점들을 나타내는 방법인데, 와우에서 보면 채광이 미니맵에 뜨는 것정도에 사용할수 있지 않나 싶다.
Image 3.6 - A Point List

Image 3.6 - A Point List (6 Primitives)


2.  Line Lists
잘 알다시피 선이다.
Image 3.7 - A Line List

Image 3.7 - A Line List (3 Primitives)

3.  Line Strips
이 형태의 모습은 Max 9에서 아웃라인만 보는 기능을 쓸때 사용하는 것과 같은 효과를 주는구나. 디버깅 할때 효과적이라고 한다.
Image 3.8 - A Line Strip

Image 3.8 - A Line Strip  (5 Primitives)

4.  Triangle Lists

Image 3.9 - A Triangle List

Image 3.9 - A Line List (2 Primitives)


5.  Triangle Strips
게임에서 면을 생성하고 물체를 그리기 위해 사용하는 가장 효과적인 방법이 바로 이것.
Image 3.10 - A Triangle Strip

Image 3.10 - A Triangle Strip (4 Primitives)

6.  Triangle Fans

Image 3.11 - A Triangle Fan

Image 3.11 - A Triangle Fan (4 Primitives)

A primitive Quirk
이 부분에서 설명하는 것은 OpenGL에서도 봤다시피 폴리곤의 앞면과 뒷면을 동시에 보여 줄것인가 아니면 한쪽면만 보여 줄것인가에 대한 것으로써 일반적으로는 한쪽 면만 보여 주지만 만약 내부에서도 사용자가 물체를 보게 될 일이 있다면 양면 모두 렌더링 하는 것이 좋다.

Image 3.12 - Primitive Only Visible When Drawn Clockwise

Image 3.12 - Primitive Only Visible When Drawn Clockwise

Image 3.13 - Primitive Visible When Drawn Either Way

Image 3.13 - Primitive Visible When Drawn Either Way

COLOR
드디어 색상 부분인데.. 헐헐...

Subtractive Color vs. Additive Color
헐 이거 중요한 개념 인데? 어렸을 적에 배운 빨강, 파랑, 노랑이 삼원색이어서 모든 색을 구성한다는 것이 틀렸단다.

색에는 Subtractive 와 Additive가 있는데 이 둘의 가장 큰 차이는 이 색들이 어떤 대상을 가리키냐 인데 바로 '빛을 가리키냐' 와 '물체를 가리키냐'로 나뉜단다.

Subtractive 색상은 바로 물체의 색상이며 주 색상이 magenta, cyan, yellow이고 Additive 색상은 바로 빛의 색상이며 주 색이 red, green, blue이다.

위 두가지 모두 어릴적 배운 3원색과는 다르군.. 그렇군.

빛의 색상은 아래와 같이 중첩되면 빛의 색이 더해서 밝은 힌색을 띄게 되어 additive color라 표현한다.

Image 3.14 - Additive Colors Add Up to White

Image 3.14 - Additive Colors Add Up to White

그런데 자세히 보면 중첩 되는 3개의 색상이 사실 magenta, cyan, yellow다!! (충격적이지 않은가?)
왜 그런지 좀 있다 살펴보고, Subtracitive 색상을 살펴 보면.. 헐 이해가 안된다. 흠. 좀 어렵군.

Image 3.15 - Subtractive Colors Subtract Out to Black

Image 3.15 - Subtractive Colors Subtract Out to Black

꼭 알아야 한다고 생각되지는 않는데 ... 게임 프로그래밍에서는 항상 Additive 색상을 사용하기는 한다. 왜냐면 모니터가 빛의 색상 조합으로 구성되기 때문인데, Subtractive도 이해해 놓는 것이 편하기는 하다.

Alpha Coloring
RGB + 알파 인데 알다시피 투명도 속성이다.

Setting the Color Using 32 Bits
D3D에서는 일반적으로 32 비트를 이용해서 색상을 지정하는데 아래와 같은 형식을 따른다.

Image 3.16 - Bit Layout of Color

Image 3.16 - Bit Layout of Color

다음 코드들이 몇가지 색상을 지정하는 방법인데

DWORD Color_A = 0xff00ff00;
DWORD Color_B = 0x88ff00cc;

저렇게 숫자로 넣으면 기억하기 힘드니 편리하게 0~255 값을 사용할 수 있는 함수가 있으니 바로 다음과 같은 함수들이다.

DWORD Color_A = D3DCOLOR_XRGB(0, 255, 0);
DWORD Color_B = D3DCOLOR_ARGB(136, 255, 0, 204);

위의 두 함수중에 XRGB는 알파 채널이 없는 색상 즉 255 값을 자동으로 알파 채널이 주는 함수다.

Light and Color
빛의 완전한 모방이란 불가능에 가깝고 그래서 3가지 종류의 빛으로 나누어서 D3D에서는 구현하는데 바로 Diffuse light, Ambient light, Specular light 이죠.

Diffuse Light
직접적인 빛이 아닌 반사에 의한 빛이 물체에 비치는 것.

Image 3.17 - Diffuse Lighting

Image 3.17 - Diffuse Lighting

Later, you will learn about sources of light.  This sphere is lit by one source, coming off from the left somewhere.  The further the sphere curves away from the light, the less that portion is lit by the source.

Ambient Light
이 빛은 어디에나 있는 것으로 간주되는 '은은한 빛'으로써 diffuse와는 달리 source가 없으며 모든 방향을 비추는 빛이다. 아래 그림은 위의 diffuse 라이트 + ambient 라이트 이다.

Image 3.18 - Diffuse and Ambient Lighting

Image 3.18 - Diffuse and Ambient Lighting

Specular Light
이것은 바로 Highlight 빛인데 반사가 존재하는 물체의 빛이다.

Image 3.19 - Diffuse, Ambient and Specular Lighting

Image 3.19 - Diffuse, Ambient and Specular Lighting



 
posted by 대갈장군