1. 구
2. 반사광
반지름 r을 설정해서 정점을 배치해서 한바퀴 돌리고,
그 위로 조금 올려서 한바퀴.. 해서 겹겹이 쌓이게 해서 구를 만든다
fRadius = 0.5f;
로컬스페이스라고 하면, 꼭짓점 좌표는 (0, 0.5, 0)
즉, v.vPos = Vec3(0.f, fRadius, 0.f);
v.vUV = Vec2(0.5f, 0.f);
v.vColor = Vec4(1.f, 1.f, 1.f, 1.f);
v.vNormal = v.vPos;
구 위에 있는 어느점이라도 표면에서 수직으로 나가는 normal 방향은 구에서 본인의 위치가 된다.
즉, 본인의 위치가 곧 normal 방향이 된다.
단위벡터는 아니다 -> 단위벡터는 길이가 1이기 때문..
v.vNormal.Normalize(); -> 반지름이 0.5 이기 때문에 1로 바꿔주려고 !
v.vTangent = Vec3(1.f, 0.f, 0.f);
v.vBinormal = Vec3(0.f, 0.f, -1.f);
vecVtx.push_back(v);
// Body
UINT iStackCount = 40; // 가로 분할 개수 - 원을 가로로 몇등분 할 것인지
UINT iSliceCount = 40; // 세로 분할 개수 - 한번 쳤으면 그걸 또 피자조각처럼 몇등분 할건지
float fStackAngle = XM_PI / iStackCount;
float fSliceAngle = XM_2PI / iSliceCount;
반사벡터 방향
월드상에서 하면 바라보는 카메라가 월드 기준으로 어디에 있는지 카메라 좌표값을 받아봐야한다.
그래서 카메라 좌표계에서 연산하는게 더 좋다!
뷰스페이스
1. 카메라가 원점
2. 카메라가 z축을 바라본다.
광원이 오는 방향도 뷰스페이스로 바꿔야한다.
output.vViewNormal = normalize(mul(float4(_in.vNormal, 0.f), g_matWV));
// 카메라에서 픽셀 지점을 바라보는 시선 벡터
float3 vEye = -normalize(_in.vViewPos);
// Light 의 ViewSpace 에서의 방향
float3 vLightDir = mul(float4(g_Light3DBuffer[0].vWorldDir.xyz, 0.f), g_matView);
// Specular 계산 -> 색칠한 곳은 방향!
float3 vViewReflect = normalize(vLightDir + 2.f * (dot(-vLightDir, _in.vViewNormal)) * _in.vViewNormal);
// 반사광 세기 -> 각도가 0 일 때, 가장 쎄다!
float fRelfectPow = pow(saturate(dot(vViewReflect, vEye)), 10);
'DirectX 11 3d' 카테고리의 다른 글
230509 skybox 개선 (스피어->큐브) (0) | 2023.05.11 |
---|---|
230508 (0) | 2023.05.11 |
220504 (0) | 2023.05.10 |
220502 (0) | 2023.05.09 |
220427 (0) | 2023.05.08 |