DirectX 11 3d

220503

슬뷔 2023. 5. 9. 02:18

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