D3DX9 - 21.11.09

김주현·2021년 11월 9일
0

d3dx9 3D

목록 보기
22/30

조명

방향성광원

방향성관원 - 내게임 전역에 미치는 광원 , 빛연산을 위해선 빛의 방향벡터가 필요하고 방향벡터가 매우 높은 위치에있기때문에 모든 객체의 방향벡터가 비슷하다.

레벨_게임플레이에 Ready_Light 함수를 선언하고 네컨에서 호출해주자.

광원 구조채인 D3DLight9을 선언해주고 ZeroMemory로 초기화해주자.
각 광원 타입에 필요한 인자만 값을 채우고 나머진 0으로 채워주면된다.

1.Type - 어떤 타입의 광원인지 지정하는 타입(방향성으로주자)

색상을 표현하는 인자 세가지 빛의 색을 세가지를 구성한거 실제의 빛을 비슷하게 구현하기위해

초록색 구체라는것은 하얀빛이 비춰졌을때 나머지색은 흡수하고 초록새만 반사해서 초록색으로 보이는것.
빛의 rgb값과 물체의 rgb값을 곱하면 어떤색으로 표현되는지 알수있다.

물체의 색을 표현하기위해산 물체가 어떤 색을 반사하는지도 알아야한다!(D3DMATERIAL9)

2.Diffuse - 순수한 빛의 색상(난반사 광원에 의한 색상이다. - 빛이 어떤 표면에닿으면 모든 방향으로 반사한다(현실과다름) 어디에서 물체를 바라보든 같은 색으로 보인다.)

명암을 어떻게 계산할까 - 정점의 노말(수직벡터)이 필요하다.정점이 구성하고있는 면의 노말을 구한다. 구해서 면이 구성하고있는 정점에 부여한다.

여러개의 면을 끼고있는 법선벡터는 법선벡터의 평균으로 구한다.

정점의 법선벡터와 빛의 방향벡터의 각으로 빛을 얼만큼 받는지를 결정한다. 180도일때 가장 빛을 많이받고 90,270일때 빛을 가장 적게 받는다.

두 벡터중 하나를 뒤집자 -> 0도일때 가장 빛을 강하게 받는다.
0~90 까지 0으로 감소 90~270 빛을 하나도 안받음 270부터 360까지 살아남 -> cos 그래프 에서 음수를 0으로 한 값이다.

결론 : 한벡터를 뒤집어서 내적하면 cos세타 값이 나오고 이를 빛의 세기로 사용하면 된다!

구한 반사된 빛의 벡터에 명암을 곱하자(색이 명암에 비례하게 됨)

3.Specular - 환경에 의한 빛반사를 의미

4.Ambient - 최소한의 색, 실제에서 빛을 직접적으로 받지않더라도 어느 공간에 있다면 최소한의 빛을 받느것을 표현해줌.

Diffuse와 Ambient 모두 D3DXCOLOR로 주면된다 (일단 하얀색으로주자)

방향성광원은 Direction 을 결정해주어야 한다. 방향벡터를 넣어주자

이 4개의 인자를 넣어주고
SetLight함수의 인자로 넘겨주자.

Ready_Light 함수 구현 - 장치가 없을경우 FAIL 리턴
장치의 광원 정보를 저장하는 기능을 하는 SetLight함수 호출
SetLight(몇번째 광원을 세팅할것인지,)

저장한 빛을 활성화해서 켜야한다. LightEnable 함수로 0번째 인덱스를 선택하고 TRUE로 켜주는것을 넣어주자.

물체의 색을 표시하는 MATERIAL은 객체마다 세팅해주어야한다.
일단은 예제를위해 여기서

D3DMATERIAL9 구조체를 선언하고

Diffuse = 흰색 ( 모두 반사하겠다)
Ambient = 0.2로 주자

m_pGraphic_Device->SetMaterial(&mtrlDesc) 해주자

한번 적용하면 다시 적용하기전 까지 값이 적용된다.

Engine_Struct에 노말벡터를 포함하는 구조체를 하나더 수행해주자.

VI버퍼_터렌이에서 FVF에 NORMAL을 추가해주자.

다음 일단 0,1,0 으로 초기화해주자.

왜 Matrial.Diffuse를 흰색으로 줬는데 텍스처의 색깔이나올까?
-> 텍스처의색에 Diffuse를 곱해주지 때문

지형의 텍스처를 디퓨즈텍스처라 부름

디퓨즈로 색을 표현할때는 디테일한 색표현이 필요하다.
객체를 구성하고있는 모든 픽셀의색을 표현하기 힘들다 -> 디자인에 맡기자 픽셀들이 어떤 빛을 반사하면되는지를 이미지에 저장해줘

정석적으로 얘기하면 물체의 디퓨즈는 의미가없다.

노멀 벡터를 넣어주자.

엔진의 VIBuffer_Terrain 클래스에서 VTXTEX구조체에서 VTEXBORTEX로 변경해주고 일단 버텍스버퍼에서는 _float3(0.f, 0.f, 0.f);으로 초기해주자

아직 모든 정점의 포지션값이 들어있지않아 법선벡터를 구할수 없기 때문이다.

인덱스버퍼를 구하면서 법선벡터를 구하고 정규화를 해주면서 더해주자

마지막으로 인덱스버퍼까지 채우고난뒤 모든 버텍스버퍼 정점의 vNormal을 정규화해준다.

0개의 댓글

관련 채용 정보