D3DX9 - 21.11.10

김주현·2021년 11월 10일
0

d3dx9 3D

목록 보기
23/30

조명 - 스펙큘러

스펙큘러는 정반사광원에 의한 반사를 의미한다.빛이 들어왔을때 정해진 방향으로만 반사
이 반사된 반사벡터와 내 시선벡터의 각도를 계샌해서 보이는지 안보이는지를 판별한다.
이를 이용해 하이라이트를 표현할 수있다.물체마다 하이라이트 색이다르기 때문에 객체마다 따로 지정해준다.-> 자기만의 색으로 하이라이트를 표현해주자.

보이는 각도의 기준
두벡터중 하나를 뒤집음 둘 사이의 각도는 0도일때 가장 하이라이트가 크게 표현됨
명암은 - 법선벡터와 빛의 벡터 의 내적
하이라이트는 - 시선벡터와 빛의 반사 벡터의 내적

시선벡터는 포지션 - 카메라 로 구할수 있다.

반사벡터를 계산하기 위해선 정점의 법선 벡터가 필요하다.

빛의 방향벡터를 뒤집고 법선벡터를 정규화후 내적함 -> 정사영 길이를 알수있다.길이를 1로 만든 법선벡터에 곱해주자. -> 길이 만큼의 법선벡터가 되고 법선벡터를 2번 더함 이거랑 뒤집기전의 원래 방향벡터를 더해주자.

빛의 스펙큘러와 머테리얼의 스펙큘러를 곱하고 위해서구한 세기를 곱해서 최종 결과를 구하자!

텍스색 (빛.디 머.디) 명암 + (빛.엠 머.엠)
+
(빛.스 머.스) 스펙큘러 세기
두개를 더해주자!

이 세기를 그대로 사용하면 거의 대부분의 영역이 하얗게 표현됨
(세기 즉 날카로움이 너무 크게 표현됨)
스펙큘러의 세기는 0에서 1로표현됨 여기서 모든 결과를 제곱하면 0~1의 값을 가지면서 약해진 값을 가지게 된다. 1과 0을 몇번 제곱하더라도 값이 변하지 않음 이렇게하면 정말 0도와 가까울때만 하이라이트가표현됨 보통 20의 30승을함.

점광원

점광원도 디퓨즈 스펙큘러 엠비엔트가 모두 필요하다
대신 디렉션은 채우지않고 포지션을 채운다.

이 포지션은 월드 좌표에서의 좌표를 설정하면된다.

RANGE는 빛의 범위를 지정

Attenuation0,1,2 빛의 감쇄를 지정 (사용하지않음)

점광원은 광원의 위치가 존재 -> 정점의 위치에서 광원의 위치를 빼서 빛의 방향벡터를 구하자. 다음 범위에따라서 빛을 받는지 않받는지를 결정

fDist = d3dxvec3Length(&(정점의 위치 - 광원의 위치));

max(0,(Range - fDistance) / RANGE)) -> 0~1로 표현가능

점광원 구현

레벨_게임플레이에서

LightDesc.Type 은 포인트로
LightDesc.Diffuse 는 흰색
LightDesc.Ambient 는 흰색
LightDesc.Specular 는 흰색
LightDesc.Position 은 조금 높게 5,10,5 정도로 주자
LightDesc.Range 는 15.ㄹ
LightDesc.Attenuation1 = 1.f

다음 디렉션까지 2개의 광원을 켜보자.

머테리얼

객체의 파츠별로 머테리얼을 따로 그려야함 이도 디테일이 하지 않음
머테리얼 디퓨즈는 픽셀별로 어떤 색을 반사할것인지를 정의하는게 중요함
머테리얼의 디퓨즈 값은 게임내에서 색을 변경할때 유용하게 사용될수있음

머테리얼은 레벨 게임플레이에서가 아닌 각 객체에서 설정해주어야한다.

빛연산이 필요없으면 객체에서 빛연산을 꺼주자

플레이어를 지형위에 올려보자.

직선을 구분하는 기준은 기울기와 y절편으로 구별할수있다.

평면을 구분하는 방법 : 평면의 기울기(3차원에서의기울기는 매우 다양하다) 그래서 평면의 법선벡터로 구분한다.
1.평면의 앞으로 뻗어있는 법선벡터
2.평면위의 점 하나

평면이라는 개념이 필요하다.

평면 방정식 : AX + BY + CZ + D = 0;

ABCD를 구하는게 관권이다.
ABC가 수직 법선벡터의 XYZ다.

ABC를 구하면 d를 구할수있다.

D3DXPLANE으로 평면을 만든다.
DX9에는 평면방정식을 구해주는 함수가 있다.(D3DXPlaneFromPoint) 는 점 세개를 외적해서 직접 평면을 구해줌
(D3DXPlaneFromNormalPoint) 는 D3DXPLANE 를 리턴

평면방정식은 무한한 평면을 의미 위에있거나 평면에 존재하거나 아래있다 이 때 값은 점과 평면사이의 거리이다.

플레이어가 어느 위치에있는지 알고있으면 그 삼각형의 버텍스버퍼값을 가져와서 점3개로 평면을 구하고 평면과 플레이어의 거리를 구해서 이를 지형의 높이로 만들어주자.
AX + BY + CZ + D = 0 에서 플레이어의 좌표 xz를 넣어주자.
y = ... 으로 식을 정리해서 이를 플레이어의 높이로 넣어주자!

0개의 댓글

관련 채용 정보