- 전체
- C/C++ 일반
- C/C++ 수학
- C/C++ 그래픽
- C/C++ 자료구조
- C/C++ 인공지능
- C/C++ 인터넷
- wxWidget
- GTK+
- UNIX or LINUX programming
- 리눅스 마스터 - 국가공인자격
- VC++/ MFC
- C#/CLI/.NET
- QT/기타UI
- Boost lib
- 오픈소스 C 분석자료
- MSA (마이크로서비스), Docker, kubernetes
- WSL(windows subsystem linux)
C/C++ 그래픽 통일 D3D 및 OpenGL 좌표 시스템
2017.09.24 20:40
통일 D3D 및 OpenGL 좌표 시스템
저자: 여행 (()
DirectX 3D과 OpenGL 좌표 시스템 차이, 우리에게 큰 번거로움을 가져다 줄 수 있도록 크로스 플랫폼 프로그래밍 하는 데에는 매우 곤혹스럽다.최근 한 개 크로스 플랫폼 게임, 자세히 다음 둘의 행렬 발견 하 고 별 차이가 없는 것이다 d3d 왼손 과 행렬 배달 줄 수 shader 다각형 완전히 정상적인 작업.
먼저 얘기 좀 둘 일부 개념 상의 차이:
(1)좌표 시스템 다르다
d3d 왼손 좌표, 다각형 오른손 좌표
(2)격자 선 순서 다르다
d3d 그래. 우선, 다각형 열 우선.이 두 개의 다른 직접 때문에 좌표 변환 순서 및 행렬 곱셈 순서 반대로 성.만약 먼저 크기 조정, 다시, 마지막 구성, 대응 행렬 각각 S, R · T 않으면 d3d 최종 행렬 m = s * r * r 위해 다각형 위해M = T * R * S
(3)감축 공간 z 순위 범위 다르다
d3d [0 1]. 예, 예, 다각형[-1, 1]
겉으로 보면 둘 매트릭스 큰 차이가 있지만 사실은 그렇지 않다.
1. 정도 손 좌표
그래픽 장치 대해 말하자면, 장치 좌표, 왼손 좌표 즉 가리키는 화면 안에 z z 값 더 큰 것을 시선을 더 먼 거리. 그래서 다각형 오른손 시스템 을 감축하다 공간 들어갈 때 어떻게 1개씩을 왼손 매다. 이 그러니까, 렌더링 관선 내부, 좌표 은 통일. 그게 왼손 좌표 행렬, 아니면 오른 좌표 행렬, 그냥 변환 까지 감축 공간 속 좀 왼손 학과 됩니다.
2.격자 선 순서
행 행렬, 열 행렬, 논리적 하나 또 하나의 바꾸다, 그러나 물리 스토어드 구조 에서 결국 완전히 일치한다.만약 한 병진 변환(x, y, z):

주의를 필요로 하는 것은 행렬 곱셈 관심 없어 행렬 실행할 행렬, 아니면 열 행렬, 모두 첫 행렬 되는 대로 가서 곱하기 두 번째 행렬.에 열 행렬 경우 이 바로 그 엉터리 지방 위해 보증 곱셈 의미 유효성 그 좌표 변환 순서에 따라 행렬의 곱셈 순서 마침 반대로.
또 조심 좀, shader 중 다각형 있는 행렬 곱셈 규칙에 따라 d3d 다르다.행렬의 곱셈 규칙에 (첫 번째 행렬 행 * 두 번째 행렬 모음):
d3d 행렬의 곱셈: Ma(0 1 2 3) * Mb(0 4 8 12)
opengl행렬의 곱셈: Ma(0 4 8 12) * Mb(0 1 2 3)
이에 대해 다각형 shader 경우 변환 순서에 따라 행렬의 곱셈 순서 여전히 반대.만약 우리가 할 수 있는 것이다 shader 전래 다각형 매트릭스 한 번 바꾸다 하면 그렇게 다각형 shader 있는 행렬 곱셈 의미가 따라 d3d 것이다 shader 완전히 일치한다!
3.수정 투영 행렬
다각형 때문에 정규직 감원은 공간 z 순위 범위 위해 [-1, 1] 따라 d3d 있는 [0, 1] 다르다, 우리 쉽게 사용할 수 d3d 투영 행렬, 반드시 다시 정의 d3d 투영 행렬.
void Matrix::perspectiveProjectionLH2( float fov, float aspectRatio,
float nearPlane, float farPlane )
{
float h = (1.0f / tanf(fov * 0.5f));
float w = h / aspectRatio;
float a = (farPlane + nearPlane) / (farPlane - nearPlane);
float b = -2.0f * farPlane * nearPlane / (farPlane - nearPlane);
m[0][0] = w; m[0][1] = 0; m[0][2] = 0; m[0][3] = 0;
m[1][0] = 0; m[1][1] = h; m[1][2] = 0; m[1][3] = 0;
m[2][0] = 0; m[2][1] = 0; m[2][2] = a; m[2][3] = 1;
m[3][0] = 0; m[3][1] = 0; m[3][2] = b; m[3][3] = 0;
}
4.총화
사용 왼손 시스템 변환 와 통일 두 플랫폼 비교적 편리하다.총괄하여 다각형 렌더링 파이프 라인 수정 절차:
(1)는 부하 층 통일 사용 왼손 좌표 변환,
(2)수정 투영 행렬 에 맞 감축 공간 z 그래프 범위[-1, 1],
(3)행렬 이 전래 shader 때 는 행렬 바꾸다 행렬 유입,
(4)지금 shader 층, 통일 사용 왼손 좌표 변환.
만약 싶지 않다 shader 중 변환 수정, 단지 할 (1) 와 (2) 충분해.
5.많이 읽다
유도 투영 행렬
다각형 d3d 단절 과 뛰어넘다.
[출처] http://www.programkr.com/blog/MEzMxADMwYT0.html
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

