Shader 22.01.12

김주현·2022년 1월 12일

셰이더

목록 보기
15/18

후처리 세이더 재질적용

우선 빛과 물체의 Diffuse중 빛의 Diffuse를 구현해보자.

현재 Shader_Deferred에서 빛 연산을 하지만 빛의 색을 받고있지도않다.

우선 빛의 색을 받고 화면에 그려줘야한다.

PS_MAIN_BLEND에서 Out.vColor를 바로 곱하면

마지막 광원의 빛의 색만 들어갈것이다.

그렇다면 Shade에 빛의색을 미리 곱해두자!

PS_OUT_LIGHT에서 Out.vShade에서 빛의색(g_vLightDiffuse)를 곱해주자.

다음 PS_MAIN_BLEND에서 vShade가 곱해지면서 빛의색이 적용된다.

그리고 Render_LightAcc_Directional에서 알파블렌드를 켜줘야 빛이 마지막것만 적용되지않고 섞인다.

이때 SrcBlend,DestBlend를 One으로 줘서 기존의 색을 그대로 사용하게 한다.

Shade 타겟은 검은색으로 초기화하자.

우선 LightDiffuse를 Light 클래스 안에서 전달해주자.

네비메시와 콜라이더가 검은색으로 그려진다 이둘은 전처리로 그려주기위한처리를 해주자.

렌더러에 리스트 하나를 추가해주자. m_DebugObject
Add_RenderDebug()함수도 추가해주자.

네비게이션의 Render함수에서 월드매트릭스를 인자로받는것이 문제가된다 이를 멤버변수로 월드매트릭스를 저장할수있게말드고 SetUP함수를 만들어서 월드매트릭스를 지정해주자. 네컨프로토에서 항등행렬로 초기화해주자.복사생성자에서 복제해주자.

콜라이더와 네비게이션의 Render함수를 통일시켜주고 컴포넌트에 가상함수로 만들어주자.

앰비언트 적용

객체들의 엠비언트를 받아오기위해 디퓨즈를 받아오기위해 한것처럼 엠비언트를 받아오자.

하지만 렌더타겟을 생성하기엔 아까운 데이터이다.

그래서 보통 엠비언트와 스펙큘러는 전역으로 (모두 0.2) 처리하는경우가 많다.

Shader_Defferd에서 엠비언트와 스페큘러를 전역으로 받고 값을 정한뒤

Out.Shade에서 엠비언트와 빛을 곱해서 더해주자.

스펙큘러

스펙큘러를 셰이드타켓에 강하게 흰색으로 그려봐야 그냥 디퓨즈가된다.

셰이더 타겟이 아닌 스펙큘러 타겟에 그려주자.

렌더러에서 스펙큘러 타겟을 추가해주자.

초기화는 검은색으로 해주자.

빛연산한 결과를 Shade 타겟에 그릴때 스펙큘러타겟에도 그리자.

Specular를 LightAcc에 추가해주자.

Shader_Defferred의 PS_OUT_LIGHT에 스펙큘러를 추가해주자.

PS_MAIN_LIGHT_DIRECTIONAL에서
Out.vSpecular.rgb에 값을 넣어주자.
(스페큘러의 A는 0으로고정하다 더했을때 영향을 안주게끔)

Reflect와 vLook이 필요하다.

Reflect는 빛의 방향벡터와 법선벡터가 필요하다.
reflect함수로 구해주자.

Look벡터를 구하기위해선 카메라의 위치가 필요하다.
g_vCamPosition을 선언하자
픽셀의 월드위치가 필요하다 -> 월드는 0~1에서 표현되지않는다.

투영은 -1 ~ 1이다 이를 저장하는것은 가능하다.

VI_VIEWPORT버퍼에다가 그리고있다.

VS에서 받아온 UV좌표를 변환해서 투영의 좌표를얻을수있다.

이제 2차원 투영스페이스상의 좌표를 구했다.

뷰-> 월드로 변환해주자.
(뷰와 투영변환행렬의 역행렬 받아오자)

두행렬 곱해주기전에 W 나누기를 거꾸로 해줘야한다.

뷰스페이스상의 Z가 필요하다.

픽셀들의 깊이값이 필요하다.

깊이를 저장하기위한 렌더타겟이 필요하다.

렌더러에서 Depth렌더 타겟을 만들자.
디퍼드에 추가해주자.

Shader_Terrain과 Mesh에 vDepth를 추가하자.

현재 스페이스에서 뷰스페이스상의 깊이를 W에 담는다.

그리고 2차원 투영변환된 z도 필요하다.

Shader_Deferred에서 뎁스를 받아와서 DepthDesc에서 넣고

vWorldPos.z를 채워주자.

다음 w를 1로 채워주면

완벽한 투영스페이스 매트릭스를 만들었다.

다음 뷰스페이스상의 Z를 곱해주자.

다음 뷰,투영 역행렬을 곱해주면 월드매트릭스를 알수있다.

0개의 댓글