0417 CoordinateSystemCvt
생각해보니까,
유니폼에서 각 렌더러에 따른
Factor줘서 곱해주면 되는 거 아닌가???
정보 -> 행렬 -> 셰이더 이 순서대로 가는데,
굳이 정보 부분에서 곱해줄 필요가 있나???
버텍스 셰이더 부분에서 팩터 곱하는 게 제일 나을 듯?
오버헤드? 그걸 신경쓸 때인가???
다시 생각해보니까,
뷰 매트릭스에서는 저기 위에 "정보" 부분에서의 변환이 필요하다.
그냥 정보부분에서 깔끔하게 하는 방법이 없을까...
enum class CoordinateSystemType {
OpenGL, // Right-handed, Z축이 나를 향하고 Y축이 위를 향함
Vulkan, // Right-handed, Z축이 나와 같은 방향을, Y축이 아래를 향함
};
2D와 3D의 좌표계가 다르다.
참고 :
2D스탠다드는 OpenGL에서 Y축만 반전된 것임.
= Z축은 신경쓰지 않지만, 나를 향함
X축이 오른쪽을,
Y축이 아래쪽을 향함. **********************************
3D스탠다드는 OpenGL과 완전히 같음.
= Z축이 나를,
X축이 오른쪽을,
Y축이 위를 향함. ************************************
// 2D 스탠다드를 각 렌더러에 맞는 좌표계로 변환.
Vector2f Convert_2D_Standard_To_Specific_CoordSystem(
const CoordinateSystemType& type,
const Vector2f& v
) {
switch (type) {
case (CoordinateSystemType::OpenGL) :{
return {v.x, -1.0f * v.y}; // 2D의 경우, GL은 Y축 반전 필요
break;
}
case (CoordinateSystemType::Vulkan) :{
return {v.x, v.y}; // 2D의 경우, VK는 반전 불필요
break;
}
}
}
// 3D 스탠다드를 각 렌더러에 맞는 좌표계로 변환.
Vector3f Convert_3D_Standard_To_Specific_CoordSystem(
const CoordinateSystemType& type,
const Vector3f& v
) {
switch (type) {
case (CoordinateSystemType::OpenGL) :{
return {v.x, v.y, v.z}; // 3D의 경우, GL은 반전 불필요
break;
}
case (CoordinateSystemType::Vulkan) :{
return {v.x, -1.0f * v.y, -1.0f * v.z}; // 3D의 경우, VK는 Y, Z축 반전 필요
break;
}
}
}