1. 程式人生 > >統一D3D與OpenGL座標系統

統一D3D與OpenGL座標系統

        DirectX 3D與OpenGL座標系統的差異性,給我們帶來很大的麻煩,讓跨平臺程式設計的新手很困惑。最近在做一個跨平臺的遊戲,仔細看了下兩者的矩陣,發現並沒有什麼大區別,將d3d左手系的矩陣傳遞給opengl shader完全可以正常工作。

        先說一下兩者一些概念上的區別:

        (1)座標系統不同

d3d左手座標系,opengl右手座標系

        (2)矩陣行序不同

d3d行優先,opengl列優先。這兩個不同,直接導致了座標變換順序與矩陣乘法順序的相反性。如果是先縮放,再旋轉,最後平移,對應的矩陣分別為S、R、T,則d3d的最終矩陣為M = S * R * T,opengl為M = T * R * S

        (3)裁減空間z取值範圍不同

d3d是[0, 1],opengl是[-1, 1]

        表面上來看,兩者矩陣差別很大,但其實不然。

1.左右手座標系

        對於顯示卡裝置來說,裝置座標系是左手座標系,即z軸指向螢幕裡面,z值越大表示距離視線越遠。因此,opengl的右手系,在進入裁減空間的時候,會轉換成左手系。這也就是說,在渲染管線內部,座標系是統一的。不管是左手座標系矩陣,還是右手座標系矩陣,只要變換到裁減空間中的點是左手系就可以了。

2.矩陣行序

        行矩陣和列矩陣,在邏輯上一個是另一個的轉置,但在物理存貯結構上卻是完全一致的。如一個平移變換(x, y, z):


        需要注意的是,矩陣乘法並不關心矩陣是行矩陣還是列矩陣,都是按照第一個矩陣的行去乘以第二個矩陣的列。對於列矩陣而言,這正是其蹩腳的地方,為了保證乘法意義的有效性,其座標變換順序跟矩陣乘法順序恰好相反。

        還要注意一點,在shader中,opengl的矩陣乘法規則跟d3d是不同的。按照矩陣乘法規則(第一個矩陣行*第二個矩陣列):

        d3d矩陣乘法:      Ma(0 1 2 3) * Mb(0 4 8 12)

        opengl矩陣乘法: Ma(0 4 8 12) * Mb(0 1 2 3)

        因此,對於opengl shader而言,變換順序跟矩陣乘法順序依然是反的。如果我們能將傳入opengl shader的矩陣做一次轉置,那麼opengl shader的矩陣乘法意義將跟d3d shader完全一致!

3.修改投影矩陣

        由於opengl的裁減空間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.總結

        使用左手系變換來統一兩個平臺是比較方便的。總結一下修改opengl渲染管線的步驟:

(1)在c++層統一使用左手座標系變換;

(2)修改投影矩陣,以適應裁減空間z座標範圍[-1, 1];

(3)矩陣在傳入shader的時候,將矩陣的轉置矩陣傳入;

(4)在shader層,統一使用左手座標系變換。

如果,不想修改shader中的變換,只用做到(1)和(2)就夠了。

5.更多閱讀

相關推薦

統一D3DOpenGL座標系統

        DirectX 3D與OpenGL座標系統的差異性,給我們帶來很大的麻煩,讓跨平臺程式設計的新手很困惑。最近在做一個跨平臺的遊戲,仔細看了下兩者的矩陣,發現並沒有什麼大區別,將d3

統一D3DOpenGL坐標系統

dir none open 轉置 .net 結構 順序 -m 坐標變換 作者:遊藍海(http://blog.csdn.net/you_lan_hai) DirectX 3D與OpenGL坐標系統的差異性,給我們帶來非常大的麻煩。讓跨平臺編

OpenGL知識點梳理3----變換坐標系統

nbsp str 形式 應用 旋轉矩陣 ans cti 表達式 知識 變換 一、需要註意的一些點 1.變換矩陣不可變,其參數不能使用變量。 2.齊次坐標w>0表示真實物理世界中的點,w=0可用來統一表示一個無窮遠的點。而實際應用中w=0常用來表示一個向量。 3

transform座標系統

預設元素transform 的旋轉、縮放、平移、斜切的座標系統的原點為該元素的幾何中心。 transform-origin 屬性 transform-origin 屬性允許更改轉換元素的位置,即原點。 語法 transform-origin: x-axis y-axis z-axis

GIS | 座標系統地圖投影

關於座標系統,首先要了解一些基本的概念,比如,大地基準,包括天球,天極,黃道等等。 這裡簡單介紹一下地球橢球的概念,地球是一個不規則的球體,所以如果完全按照地球原來的形狀去求解關於地球的問題是相當複雜的,由於地球的形狀類似於一個橢球體,所以我們選擇利用一個橢球體來代替地球以便於我們對問題的求解。

Learn OpenGL (六):座標系統

為了將座標從一個座標系變換到另一個座標系,我們需要用到幾個變換矩陣,最重要的幾個分別是模型(Model)、觀察(View)、投影(Projection)三個矩陣。我們的頂點座標起始於區域性空間(Local Space),在這裡它稱為區域性座標(Local Coordinate),它在之後會變為世界座

opengl學習之路六,座標系統

QQ:609162385 下載連結:https://download.csdn.net/download/cqltbe131421/10703034 在上一個教程中,我們學習瞭如何有效地利用矩陣的變換來對所有頂點進行變換。OpenGL希望在每次頂點著色器執行後

ArcGIS教程:ArcGIS中的座標系統定義投影轉換

        座標系統是GIS資料重要的數學基礎,用於表示地理要素、影象和觀測結果的參照系統,座標系統的定義能夠保證地理資料在軟體中正確的顯示其位置、方向和距離,缺少座標系統的GIS資料是不完善的,因此在ArcGIS軟體中正確的定義座標系統以及進行投影轉換的操作非常重要。

OpenGL備忘6---座標系統

1.經常用到的五個座標系統 區域性空間(Local Space,或者稱為物體空間(Object Space))世界空間(World Space)觀察空間(View Space,或者稱為視覺空間(Eye

opengl es 渲染方式 紋理座標設定 ,OpenGL ES 模型檢視之縮放操作

OpenGl ES關於渲染方式有以下兩種: RENDERMODE_CONTINUOUSLY和RENDERMODE_WHEN_DIRTY。 預設渲染方式為RENDERMODE_CONTINUOUSLY,這兩種渲染的含義是: RENDERMODE_CONTINUOUSL

cocos2dx學習之路----第七篇(座標系統中本地座標世界座標的轉換詳解)

這一篇我們來談談關於座標系統中本地座標與世界座標的轉換問題。 在上一篇中我們知道了標準的螢幕座標系、本地座標與世界座標的區別,還了解了關於cocos2dx的座標系問題。 其實關於OpenGL的座標,如果我們做2d程式設計,是可以暫時忽略Z軸座標的。但是卻需要記住的是渲染的深

國內各地圖API座標系統比較轉換

一、各個座標系的概況         眾所周知地球是一個不規則橢圓體,GIS中的座標系定義由基準面和地圖投影兩組引數確定,而基準面的定義則由特定橢球體及其對應的轉換引數確定。 基準面是利用特定橢球體對特定地區地球表面的逼近,因此每個國家或地區均有各自的基準面。基準面是在橢

【轉】+【舉例】ArcGIS中的座標系統定義投影轉換

UTM (Universal Transverse Mercator)座標系是由美國軍方在1947提出的。雖然我們仍然將其看作與“高斯-克呂格”相似的座標系統,但實際上UTM採用了網格的分帶(或分塊)。除在美國本土採用Clarke 1866橢球體以外,UTM在世界其他地方都採用WGS84。UTM是由美國製定

ArcGIS中的座標系統定義投影轉換

轉:http://www.higis.cn/Tech/tech/tId/60/ ArcGIS中的座標系統定義與投影轉換 座標系統是GIS資料重要的數學基礎,用於表示地理要素、影象和觀測結果的參照系統,座標系統的定義能夠保證地理資料在軟體中正確的顯示其位置、方向和距離,缺少

指令篇:文件文件系統的壓縮解壓打包(歸檔)解壓___gzip、zcat;bzip2、bzcat;zip; tar

roo 壓縮命令 過時 bsp 演示 組合 localhost 打包 mov 一、文件與文件系統的壓縮:   1、單文件的四種壓縮命令:     ①、Compress  (過時了,不做過多說明)     ②、gzip,zcat   (gzip:壓縮。zcat:查看)    

第九章、文件文件系統的壓縮打包

一個 and cpio ora 自己 align node filename ace 第九章、文件與文件系統的壓縮與打包 1. 壓縮文件的用途與技術 2. Linux 系統常見的壓縮命令   2.1 compress   2.2 gzip, zcat   2.3 bzip2

解決Ubuntu Windows 雙系統的時間同步問題

ubuntu時間同步 windows與wwindows時間 #將硬件時鐘調整為與本地時鐘一致 sudo timedatectl set-local-rtc 1sudo hwclock --systohc --localtime#與上面命令效果一致 本文出自 “XnNetBlog” 博客,請務必保留此出

UML圖機房收費系統實例

說明 nbsp 相互 csdn r文件 擁有 cti 錯誤 tex 前言 通過看視頻,對於UML也有了一些初步的了解。前面也介紹了UML的三個基本塊、規則和機制,只是這些東西就像是一個個機器的零部件。要組合起來才幹發揮作用。所以,實例才是驗證

關於文件文件系統的壓縮打包命令-Linux(筆記)

ber 磁盤 數據流重定向 java lock level lines markdown con 1、gzip : 壓縮命令 gzip [-cdtv#] 文件名稱 (後綴為.gz) -c :將壓縮的數據輸出到屏幕上,可通過數據流重定向處理

OpenCV OpenGL 的關系是什麽?

open 增強 paint 商業 用戶界面 tps div cuda pen OpenCV是 Open Source Computer Vision LibraryOpenGL是 Open Graphics LibraryOpenCV主要是提供圖像處理和視頻處理的基礎算法