학원

DirectX 3D DirectionalLight

Srff5123 2023. 11. 7. 21:42
728x90

맵의 일부분에 원형의 PointLight를 비추는 라이트 만들기

 

우선 Scenes에 새로운 LightScene헤더 추가

생성자 소멸자 추가 후 순수 가상함수로 선언과 정의로 cpp파일 만들어주고

GameManager에서 기존에 쓰던 맵 LightScene으로 바꿔주기

 

다시 헤더 파일에  Private로  PointLight를 테스트 할 때 결과 창이 잘 보이도록

평면을 깔아줄 Quad 변수를 만들고,  그 위에 올라갈 Sphere 생성

 

cpp로 이동하여

생성자에 quad와 Sphere 생성하고

Load해주기

 

다음 밑에서 quad와 Sphere를 Delete하고

Update와 Render, GUIRender 까지 해주기

 

실행하여 Imgui로 quad크기를 조절하여 Sphere밑에 깔아주고, 저장하여 작업 공간 만들어주기

 

이제 Light 조절을 위해 Light hlsl파일(꼭지점 셰이더) 생성 해주고, NormalMapping.hlsl 코드 가져와 복붙

하고 수정하고 

 

Light연산에서 필요한 데이터를 정리를 해준다. PixelHeader.hlsl로 이동하여

구조체 LightData와 LightPixelInpiut(VertexHeader에서 빼오기)  생성하여

 Light연산에 필요한 normal (법선), basecolor(기본 색상), specualrintensity(정반사값),

worldPos(월드 위치 좌표), viewDir(방향)을 설정해주고

 

normal값은 그냥 뽑아줄수없어 그것을 위해 float3함수 GetNormal생성

매개변수로

T(tangent) : 정점에서 접선정보를 불러올 때 사용하는 시맨틱 x축

B(binormal) : 정점에서 종법선정보를 불러올 때 사용하는 시맨틱 y축

N(Normal) : 면에서 수직인 법선벡터  z축

을 받아 normalize(정규화)를 시켜주고, normal map체크를 해주어 있을경우 조작된

법선을 N에 정규화하여 넣어주고 없을 경우 N을 반환

 

다음 LightDate를 반환하는 GetLightData함수 만들어주고 매개변수로 LightPixelInput값 가져오기)

매개변수 받아서 우리가 원하는 LightData를 뽑아줌

 

 

다음 위 LightBuffer로이동하여 float4 ambientCeil 변수 추가하여 천장에있는 간접광을 따로 준다.

 

CalcAmbient함수를 만들어 LightData를 받아 Ambient(간접광)값을 따로 구해주고

법선의 y값이 1로 가면 위를 가리키고 음수면 밑을 가리키는데 이것을 수치로 주어 간접광 강도를

법선을 이용 이렇게 하면 원래의 간접광에 천장간접광을 주어 위쪽이 간접광을 더 받도록 만들수

있음.

 

이제 다시 Light.hlsl 파일로 이동하여 값 추가

 

실행해보면 간접광만 주어도 입체감이 살아남

 

 

빛같은 경우는 게임에서 3가지 정도로 보는데

DirectionalLight(방향만있는 햇빛), PointLight(촛불, 백열구 구방향), SpotLight(후레쉬, 콘모양)

 

DirectionalLight 구현

우선 구조체로 빛연산에 필요한 정보를 담아주고,

 

CalcDirectional 함수 생성

 

toLight(빛의 방향)

diffuseIntensity(난반사)

finalcolor(빛 색깔)

 

diffuseIntensity를 체크해주어

Blinn-Phong Shading 적용 해주기 Phong의 변형 방법

Phong : View Vector로 부터 반사된 방향에 조명이 있으면, 그 부분의 밝기가 가장 밝음

수학적 공식으로는 View Vector를 Normal(법선)기준으로 반사하는 Reflection Vector와

Light Vector의 내적으로 표현하는데 Blinn Phong같은 경우에는 연산을 좀더 줄이기 위해,

Dot 내적 연산 대신에 View Vector와 Light Vector의 중간값인 Half Vector를 구하여 

Normal Vector와 Dot을 하여, 내적 연산을 줄이는 방법

 

다시 본론으로 돌아와 quad 평면에 법선을 추가하여 quad도 간접광 효과를 받을수 있도록

수정하고

 

VertexLatout으로 이동하여 UVNormal추가하고

 

다시 quad.cpp로 이동하여 normal과 tangent추가하고 실행하여 테스트

 

완료

 

 

728x90