2016-10-26 9 views
0

전/후 곱셈, 행/열 주요, DirectX 대 OpenGL에 대한 여러 기사와 게시물을 읽었으므로 처음보다 혼란 스러울 수 있습니다.OpenGL 대 DirectX, 로컬 대 글로벌?

그래서, 우리는 OpenGL에서 해당 지침 (의사) 쓰기 가정 해 봅시다 : 나는, OpenGL을이 'V 할 것 이해하는 바로는

번역 (...)

회전 (...)를 을 = R * T * v를 사용하여 벡터의 로컬 좌표 프레임을 효과적으로 변환합니다.

그러나 DirectX의

, 우리가 같은 순서로 변환 (의사),

회전 (...) 이

는 결과가 동일하지 않습니다 번역 (...) 할 경우, 권리? DirectX가 미리 곱하기 때문에 결과는 v '= v * R * T가되어 전역 좌표를 사용하여 벡터를 변형합니다.

OpenGL이 포스트 곱셈이고 DirectX가 미리 곱셈을한다고 말하면 DirectX가 전역 좌표로 이동하는 동안 OpenGL이 로컬 좌표로 이동한다고 말하는 것과 같습니다.

감사합니다.

+2

OpenGL 또는 DirectX에는'rotate()'또는'translate()'메소드가 없습니다. 그래서 당신은 무엇을 언급하고 있습니까? 그리고 오래된 OpenGL 행렬 스택 함수 인'glRotatef()'등은 포함되지 않습니다. –

+1

이것이 문법을 사용하지 않고 2 개의 라이브러리를 비교하기 때문에 의사 코드를 언급 한 것입니다. –

+0

그러나 두 라이브러리 중 어느 것도이 종류의 구문을 지원하지 않으면 이러한 종류의 의사 코드를 사용할 필요가 없습니다. 보다 구체적으로, OpenGL은 통합 수학을 전혀 가지고 있지 않으며 DirectX의 수학 라이브러리는 라이브러리 자체로 추출되었습니다. –

답변

0

OpenGL에서 사전 곱셈과 같은 것은 없습니다.

당신이 OpenGL을이 열 - 주요 레이아웃의 행렬 저장하는, 인 곱셈을 반대로 생각하는 이유 :

a c 
b d 

전치 행렬을 곱하는 수학적 규칙은 다음과 같습니다 그래서

A^T * B^T = (B*A)^T 

v' = v * R * T (모든 행 - 주요 행렬)을 계산하려는 경우

(v')^T = v * R * T 

또는 의사 코드 :

translate(...) rotate(...) translate(...) 

은 또한 당신도 당신의 회전 및 변환 행렬 열 주요 저장할 수 있습니다.

1

가장 좋은 방법은 Matrices, Handedness, Pre and Post Multiplication, Row vs Column Major, and Notations입니다.

  • OpenGL 코드는 종종 오른 손잡이 좌표계, 열 - 주요 행렬, 열 벡터 및 사후 곱셈을 사용합니다.

  • Direct3D 코드는 종종 왼손잡이 좌표계, 행 주요 행렬, 행 벡터 및 사전 곱셈을 사용합니다.

는 XNA 게임 스튜디오의 수학 라이브러리 (따라서 Monogame, 유니티 등) 시스템, 행 주요 행렬, 행 벡터, 사전 곱셈을 조정 오른 손잡이 사용합니다.

DirectXMath 라이브러리는 행 주요 행렬, 행 벡터 및 사전 곱셈을 사용하지만 중요한 경우 왼손잡이 또는 오른 손잡이 좌표 시스템을 사용하도록 선택할 때까지 남겨 둡니다. 이것은 더 오래된 것의 지금조차이었다 deprecated D3DXMath.

두 시스템에서 여전히 동일한 개체 좌표 -> 세계 좌표 -> 눈 좌표 -> 클립 좌표 변환을 수행하고 있습니다.

using namespace glm; 

mat4 myTranslationMatrix = translate(10.0f, 0.0f, 0.0f); 

mat4 myRotationMatrix = rotate(90.f, vec3(0, 1, 0)); 

mat4 myScaleMatrix = scale(2.0f, 2.0f, 2.0f); 

mat4 myModelMatrix = myTranslationMatrix * myRotationMatrix * myScaleMatrix; 
vec4 myTransformedVector = myModelMatrix * myOriginalVector; 

는 DirectXMath에서 당신이 할 것 :

using namespace DirectX; 

XMMATRIX myTranslationMatrix = XMMatrixTranslation(10.0f, 0.0f, 0.0f); 

XMMATRIX myRotationMatrix = XMMatrixRotationY(XMConvertToRadians(90.f)); 

XMMATRIX myScaleMatrix = XMMatrixScaling(2.0f, 2.0f, 2.0f) 

XMMATRIX myModelMatrix = myScaleMatrix * myRotationMatrix * myTranslationMatrix; 
XMVECTOR myTransformedVector = XMVector4Transform(myOriginalVector, myModelMatrix); 

을 그리고 당신은 그 결과와 같은 변환을 얻을 것이다

그래서 OpenGL을 GLM과 당신이 할 수 있습니다.

당신이 DirectXMath를 처음 사용하는 경우, 다음의 C++ 생성자와 연산자와 엄격한 SIMD 친화적 정렬 요구 사항의 일부를 숨 깁니다 DirectX Tool Kit에서 SimpleMath 래퍼 살펴 보셔야합니다. SimpleMath는 XNA Game Studio C# 수학 디자인을 기반으로하기 때문에 오른쪽보기 좌표를 사용한다고 가정하지만 원할 경우 왼손보기 좌표를 사용하기 위해 '기본'DirectXMath와 쉽게 혼합 할 수 있습니다.

이러한 결정의 대부분은 임의적 이었지만 올바른 설계 추론을 가지고있었습니다. OpenGL의 수학 라이브러리는 포스트 멀티 플리 팅의 일반적인 수학적 규칙에 부합하려고 시도했는데, 이로 인해 컬럼 - 주요 매트릭스가 채택되었습니다. Direct3D 초기에 팀은 연결 순서를 뒤집어 놓는 것이 혼란스럽고 모든 규칙을 뒤집을 수 있다고 느꼈습니다.

몇 년 후 XNA Game Studio 팀은 기존의 Direct3D 연결 순서가 직관적이라고 느꼈지만 '앞으로'가 음수 인 것은 혼란 스럽기 때문에 오른 손잡이 좌표로 전환했습니다. 따라서보다 현대적인 Direct3D 샘플의 대부분은 오른 손잡이 뷰 시스템을 사용하지만 Direct3D 샘플의 왼쪽 및 오른쪽보기 설정을 모두 볼 수 있습니다.이 시점에서 우리는 실제로 "OpenGL 스타일", " 고전적인 Direct3D 스타일 "및"현대 Direct3D 스타일 "을 지원합니다.

고정 관념의 하드웨어를 사용하지만 프로그램 가능한 쉐이더 파이프 라인을 사용하여 작업을 수행 할 때 실제로 이러한 관습이 중요하다는 것은 사용자가 일관성을 유지한다는 것입니다. 실제로, HLSL 셰이더는 행렬이 열 - 주요 형식이 될 것으로 기대하므로 기본적으로 DirectXMath 행렬은 상수 버퍼에 복사 될 때 바뀝니다.