- 전체
- 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
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 15 |
[C/C++ graphic GUI] An introduction to the Dear ImGui library : Dear ImGui 라이브러리 소개
| 졸리운_곰 | 2023.11.07 | 363 |
| 14 | [C/C++, graphics] SDL Tutorial Basics | 졸리운_곰 | 2021.05.15 | 316 |
| 13 |
How to Install Dev-C++ and the GLUT Libraries for Compiling OpenGL Programs with ANSI C
| 졸리운_곰 | 2021.02.02 | 321 |
| 12 |
CONREC : A Contouring Subroutine 등고선 그리기
| 졸리운_곰 | 2018.01.11 | 638 |
| 11 |
왼손 / 오른손 좌표계 비교: Left- vs. Right-handed coordinate systems
| 졸리운_곰 | 2017.09.24 | 432 |
| 10 |
3D Graphics with OpenGL
| 졸리운_곰 | 2017.09.24 | 1214 |
| 9 | OpenGL의 회전순서 | 졸리운_곰 | 2017.09.24 | 294 |
| » |
통일 D3D 및 OpenGL 좌표 시스템
| 졸리운_곰 | 2017.09.24 | 337 |
| 7 |
[OpenGL] 중심점(pivot)으로 물체 회전하기
| 졸리운_곰 | 2017.06.25 | 1139 |
| 6 |
3D Graphics with OpenGL
| 졸리운_곰 | 2017.06.06 | 415 |
| 5 |
OpenGL프로그래밍:간단한 다각형 랜더링
| 졸리운_곰 | 2017.06.06 | 537 |
| 4 | 기하학 사이트들.. | 졸리운_곰 | 2017.06.06 | 330 |
| 3 |
기하변환
| 졸리운_곰 | 2017.06.06 | 989 |
| 2 |
assimp : Open Asset Import Library
| 졸리운_곰 | 2017.05.14 | 352 |
| 1 |
MeshLab the open source system for processing and editing 3D triangular meshes.
| 졸리운_곰 | 2017.05.13 | 386 |

