-V._41_42_43로 계산했으나,| 용어 | 설명 |
|---|---|
| View Matrix (V) | 월드 → 카메라 좌표계로의 변환 행렬 |
| World Matrix | 로컬 → 월드 변환 행렬 |
| Inverse View Matrix (VInv) | View Matrix의 역행렬 (카메라의 월드 변환) |
| CameraPosition() | 쉐이더에서 카메라 좌표를 반환하는 함수 |
| Emissive | 물체 자체에서 방출되는 빛 효과 |
MaterialDesc& desc = material->GetMaterialDesc();
desc.ambient = Vec4(1.f);
desc.diffuse = Vec4(1.f);
desc.specular = Vec4(1.f);
desc.emissive = Vec4(1.f);
LightDesc lightDesc;
lightDesc.ambient = Vec4(0.f);
lightDesc.diffuse = Vec4(0.f);
lightDesc.specular = Vec4(0.f);
lightDesc.emissive = Vec4(1.f, 0.f, 0.f, 1.f); // 빨간색 Emissive
MeshOutput output;
output.worldPosition = input.position.xyz; // ❌ 오류!
→ input.position은 Local 좌표이므로 여기에 World 변환이 필요하다.
output.position = mul(input.position, W); // 월드 좌표 계산
output.worldPosition = output.position.xyz; // ✅ 수정
float4 PS(MeshOutput input) : SV_TARGET
{
ComputeNormalMapping(input.normal, input.tangent, input.uv);
float3 pos = CameraPosition(); // 카메라 좌표 출력용
return float4(pos, 1);
}
float3 CameraPosition()
{
return -V._41_42_43; // ❌ 잘못된 카메라 좌표 추출
}
_41_42_43는 -C•Right, -C•Up, -C•Look 내적값V = | R U L 0 |
| |
| -C•R -C•U -C•L 1 |
C는 카메라 위치, R은 Right, U는 Up, L은 Look 벡터-C가 아님 → 역행렬 필요cbuffer GlobalBuffer
{
matrix V;
matrix P;
matrix VP;
matrix VInv; // ✅ View 역행렬 추가
};
float3 CameraPosition()
{
return VInv._41_42_43; // ✅ 정확한 카메라 위치
}
struct GlobalDesc
{
Matrix V = Matrix::Identity;
Matrix P = Matrix::Identity;
Matrix VP = Matrix::Identity;
Matrix VInv = Matrix::Identity; // ✅ View 역행렬 저장
};
void RenderManager::PushGlobalData(const Matrix& view, const Matrix& projection)
{
_globalDesc.V = view;
_globalDesc.P = projection;
_globalDesc.VP = view * projection;
_globalDesc.VInv = view.Invert(); // ✅ 역행렬 계산
_globalBuffer->CopyData(_globalDesc);
_globalEffectBuffer->SetConstantBuffer(_globalBuffer->GetComPtr().Get());
}
-V._41_42_43 방식은 회전 성분까지 포함되어 잘못된 좌표를 반환하게 된다.CameraPosition() 함수를 통해 정확한 좌표를 사용해야 조명 계산이 일관성 있게 작동한다.