若是你想把圖形渲染在正確的位置上,那麼座標的設置就很重要了。在OpenGL中,與座標相關的主要有笛卡爾座標、座標裁剪、紋理座標、MVP(Model View Projection)轉換。算法
1.笛卡爾座標spa
在二維繪圖中,笛卡爾座標有一個X軸和一個Y軸組成,X軸爲水平方向,Y軸爲垂直方向,X和Y相互垂直。如圖1。關於正負方向問題,默認如圖1上標示,可是咱們能夠根據實際需求本身定義。(左下角爲(0, 0)原點).net
圖1:翻譯
在三維繪圖中,笛卡爾座標多了一個Z軸,Z軸同時垂直於X和Y軸。Z軸的實際意義表明着三維物體的深度。如圖2。關於正負方向問題,默認如圖2上標示,可是咱們能夠根據實際需求本身定義。對象
圖2:blog
2.座標裁剪排序
窗口是以像素爲單位進行度量的。開始在窗口中繪製點、線和形狀以前,要把指定的笛卡爾座標對翻譯成屏幕座標,咱們能夠經過指定佔據窗口的笛卡爾區域來轉換,這個區域叫作裁剪區域。在二維空間中,有兩種常見的裁剪區域。第一種,裁剪區域就是窗口內部最小和最大的x、y值,如圖3。第二種就是根據窗口指定原點位置,如圖4。get
圖3:it
圖4:io
在OpengL繪圖中採用的裁剪座標是第二種,而且x、y的取值爲-1~+1,這稱爲單位座標。固然咱們日常直接使用setPosition(x=500,y=600),x和y值到最後仍是會經過矩陣相乘轉換成單位座標,這是涉及到模型視圖、投影的變換,即MVP變換(Model View Projection)。
3.紋理座標(左上角爲(0, 0)原點)
在指定了圖形的笛卡爾座標後,若是想要在圖形上進行貼圖,則要設置好紋理座標。紋理座標要麼是指定爲着色器的一個屬性,要麼經過算法計算出來。典型狀況下,紋理座標是做爲0.0到1.0範圍內的浮點值指定,固然你也能夠設置本身預約的範圍,而後再着色器中進行單位化計算。紋理座標的命名爲s、t和q(與頂點座標x、y、z、w類似),支持從一維到三維的紋理座標,而且能夠選擇一種對座標進行縮放的方法。如圖5。
圖5:
注意:若是紋理通過DXT壓縮(一般爲jpg格式),紋理的座標的t座標會反轉。即原點變成左上角了,y軸向下爲正,x依舊向右爲正。由於DXT壓縮源自DirectX,紋理座標和OpenGL相比,因此使用壓縮紋理時,得用「t變=1.0-t前」來獲取正確的紋素。即在OpenGL中(0,0)變爲(0,1),(0,1)變爲(0,0),(1,1)變爲(1,0),(1,0)變爲(1,1)。
4.模型視圖、投影
首先,咱們來看看OpengGL變換的術語。
視圖(View)--指定觀察者或照相機的位置。
模型(Model)--在場景中移動物體。
模型視圖--描述視圖和模型變換的二元性。
投影(Projection)--改變視景體的大小或從新設置它的形狀。
視口--這是僞改變,只是對窗口上的最終輸出進行縮放。
視圖座標與視圖變換
視覺座標是相對觀察者的視角而言的,它是一個虛擬的固定座標系,一般用做參考座標系。 視圖變換容許咱們把觀察點放在任何位置,並容許在任何方向上觀察場景。肯定視圖變換就像在場景中放置照相機並讓它指向某個方向。
模型變換
模型變換用於操縱模型和其中的特定對象,這裏的模型指的是點的笛卡爾座標,這些變換將對象移動到須要的位置,而後再對它們進行旋轉和縮放。一般代碼如,Sprite::moveTo(x,y),Sprite::scale(x)。這裏須要注意的是模型變換的順序,由於矩陣的相乘不遵照結合律,所以變換順序不一樣,一般獲得的結果會不一樣。
模型視圖變換
模型視圖變換是模型變換和視圖變換在變換管線中的組合。由於有時兩種變換的效果同樣的,如將對象向後移動和將參考座標系向前移動在視覺上的效果同樣,可是後者的變換對全部的元素都有效,前者只做用於本身。因此,要看本身須要那種效果來進行那種變換。
須要注意的是,在OpengL中的矩陣是以列優先排序的。
投影變換
投影變換將在模型視圖變換以後應用到頂點上,這種投影定義了視景體並建立了裁剪平面。投影變換有兩種:正投影和透視投影。
正投影,全部多邊形都是按一樣相對大小來在屏幕上繪製的。線和多邊形使用平行線來直接映射到2D屏幕上。適合藍圖、文本等二維圖形。如圖6。
圖6:
透視投影,經過非平行線來把圖形映射到2D屏幕上,有透視縮短的特色,更加貼近現實。如圖7。
圖7:
5.總結
最後,咱們梳理一下渲染過程當中座標變換的流程,如圖8。
圖8:
如需轉載,請標明出處,http://blog.csdn.net/cbbbc/article/details/39738641