오늘 배운 것
1. 3d물체 전용 쉐이더 만들기, 3d전용 재질 만들기
std3d.fx / std3dMtrl
2.1 하려다가 그래픽 파이프라인.. 다시 복기
3. lighting 명암(광원) 작업 (2교시)
draw 하면 그래픽스 파이프라인 시작!
draw 함수는 누가 가지고 있을까 ? Mesh
랜더링을 담담하는건 랜더컴포넌트!
VS_OUT
output.vPosition = mul(float4(_in.vPos, 1.f), g_matWVP);
1.f 로 마지막에 넣은 이유? 이동값이 들어있기 때문에 그걸 이용하기 위해서.
(명암작업)
구조화버퍼 -> 수식 넘기기
static float3 g_LightDir = (1.f, -1.f, 0.f);
static float4 g_LightColor =
방향을 월드 기준으로 사선?으로 내린다
x축으로 1 y축으로 -1 z축으로 0
방향벡터는 언제나 길이가 1이어야하니까 normalize를 해서 길이를 1이 되게 한다.
=> float3 vLightDir = normalize(g_LightDir);
빛이 들어온 방향이랑 노말 방향을 내적을 할 때, 왼쪽의 각도처럼 되는게 아니라 오른쪽 각도처럼 되기 때문에
-를 붙여줘서 왼쪽 각도처럼 되게끔 한다!
float3 vLightDir = -normalize(g_LightDir);
Q. 로컬스페이스랑 월드스페이스랑 왜 같이 사용하면 안될까 ?
로컬스페이스는 Mesh, 즉 리소스 개념이다. 즉, 로컬은 정해져있지 않다.
언제든지 누구나 사용할 수 있는 것인데, 이동 or 회전시키면서 월드스페이스로 갈 수 있다..
방향이 자기 상황에 따라 달라질 수 있다.
월드에 있는 것은 이미 정해져있기 때문에 빛을 받는 상황이 mesh 마다 다를 수 있기 때문에 좌표계를 꼭 일치해주어야한다.
로컬스페이스에서 월드스페이스로 바꿀때
float3 vWorldNormal = nomalize (mul(float4(_in.vNormal, 0.f), g_matWorld));
4행에 이동정보가 들어있기 때문에, 월드로 바뀌었어도 안에 있는 상태정보에서 회전이 중요하기 때문에
이동을 시키면 안되기 때문에 (위치, 좌표를 나타내게 됨) 4행을 0으로 두어야한다.
월드행렬 안에는 scale 정보도 있기 때문에 이동을 안해도 방향벡터의 크기가 늘거나 줄어들수가 있기 때문에 nomalize 시켜주어야한다.
Q. vLightDir 와 vWorldNormal 을 왜 내적해야 되는지 ?
둘은 정규화 상태인데 내적을 하면 아래처럼 되는데, 길이를 nomalize했기 때문에 1 x 1 이 되어 cos세타만 남게 된다.
그럼 빛의 세기인 cos세타값을 얻을 수 있다!
float fLigitPow = saturate(dot(vWorldNormal, vLightDir)); -> 해당 정점에서 받는 빛의 세기
saturate-> 음수로는 못벗어나게 0 ~ 1로 고정시켜주는것.
PS에서 면의 세기를 알아야하는데, 정점에서 전달한 값이 픽셀로 전달할 때는 보간해서 들어간다.
'DirectX 11 3d' 카테고리의 다른 글
230509 skybox 개선 (스피어->큐브) (0) | 2023.05.11 |
---|---|
230508 (0) | 2023.05.11 |
220504 (0) | 2023.05.10 |
220503 (0) | 2023.05.09 |
220427 (0) | 2023.05.08 |