opengl不熟悉的部分

3D座標轉爲2D座標的處理過程是由OpenGL的圖形渲染管線(Graphics Pipeline,大多譯爲管線,實際上指的是一堆原始圖形數據途經一個輸送管道,期間經過各種變化處理最終出現在屏幕的過程)管理的。

圖形渲染管線可以被劃分爲兩個主要部分:第一部分把你的3D座標轉換爲2D座標,第二部分是把2D座標轉變爲實際的有顏色的像素。


藍色的部分我麼可以注入自定義的着色器(Shader)

OpenGL着色器是用OpenGL着色器語言(OpenGL Shading Language, GLSL)寫成的。


標準化設備座標(Normalized Device Coordinates, NDC)。

屏幕空間座標(Screen-space Coordinates)。

視口變換(Viewport Transform)。


頂點緩衝對象(Vertex Buffer Objects, VBO)。

索引緩衝對象(Element Buffer Object,EBO,也叫Index Buffer Object,IBO)。

和頂點緩衝對象一樣,EBO也是一個緩衝,它專門儲存索引,OpenGL調用這些頂點的索引來決定該繪製哪個頂點。

索引繪製(Indexed Drawing)。


頂點屬性(Vertex Attribute)。

一個向量的分量可以通過vec.x這種方式獲取,這裏x是指這個向量的第一個分量。你可以分別使用.x、.y、.z和.w來獲取它們的第1、2、3、4個分量。GLSL也允許你對顏色使用rgba,或是對紋理座標使用stpq訪問相同的分量。

重組(Swizzling)。


在3D空間中旋轉需要定義一個角和一個旋轉軸(Rotation Axis)。


利用旋轉矩陣我們可以把我們的位置向量沿一個單位軸進行旋轉。也可以把多個矩陣結合起來,比如先沿着x軸旋轉再沿着y軸旋轉。但是這會很快導致一個問題——萬向節死鎖(Gimbal Lock,可以看看這個視頻(優酷)來了解)。我們不會討論它的細節,但是一個更好的解決方案是沿着任意軸比如(0.662, 0.2, 0.7222)(注意這是個單位向量)旋轉,而不是使用一系列旋轉矩陣的組合。這樣一個(超級麻煩的)矩陣是存在的,見下面這個公式,(Rx,Ry,Rz)(Rx,Ry,Rz)代表任意旋轉軸:


即使這樣一個矩陣也不能完全解決萬向節死鎖問題(儘管會極大地避免)。避免萬向節死鎖的真正解決方案是使用四元數(Quaternion),它不僅安全,而且計算更加友好。

建議您在組合矩陣時,先進行縮放操作,然後是旋轉,最後纔是位移,否則它們會(消極地)互相影響。比如,如果你先位移再縮放,位移的向量也會同樣被縮放.


座標系統:

  • 局部空間(Local Space,或者稱爲物體空間(Object Space))。
  • 世界空間(World Space)。
  • 觀察空間(View Space,或者稱爲視覺空間(Eye Space))、攝像機空間(Camera Space)。
  • 裁剪空間(Clip Space)。
  • 屏幕空間(Screen Space)。

爲了將座標從一個座標系變換到另一個座標系,我們需要用到幾個變換矩陣,最重要的幾個分別是模型(Model)、觀察(View)、投影(Projection)三個矩陣。我們的頂點座標起始於局部空間(Local Space),在這裏它稱爲局部座標(Local Coordinate),它在之後會變爲世界座標(World Coordinate),觀察座標(View Coordinate),裁剪座標(Clip Coordinate),並最後以屏幕座標(Screen Coordinate)的形式結束。


  1. 局部座標是對象相對於局部原點的座標,也是物體起始的座標。
  2. 下一步是將局部座標變換爲世界空間座標,世界空間座標是處於一個更大的空間範圍的。這些座標相對於世界的全局原點,它們會和其它物體一起相對於世界的原點進行擺放。
  3. 接下來我們將世界座標變換爲觀察空間座標,使得每個座標都是從攝像機或者說觀察者的角度進行觀察的。
  4. 座標到達觀察空間之後,我們需要將其投影到裁剪座標。裁剪座標會被處理至-1.0到1.0的範圍內,並判斷哪些頂點將會出現在屏幕上。
  5. 最後,我們將裁剪座標變換爲屏幕座標,我們將使用一個叫做視口變換(Viewport Transform)的過程。視口變換將位於-1.0到1.0範圍的座標變換到由glViewport函數所定義的座標範圍內。最後變換出來的座標將會送到光柵器,將其轉化爲片段。

物體的座標從局部變換到世界空間;該變換是由模型矩陣(Model Matrix)實現的。

平移/旋轉場景從而使得特定的對象被變換到攝像機的前方。這些組合在一起的變換通常存儲在一個觀察矩陣(View Matrix)裏,它被用來將世界座標變換到觀察空間。

爲了將頂點座標從觀察變換到裁剪空間,我們需要定義一個投影矩陣(Projection Matrix),它指定了一個範圍的座標,比如在每個維度上的-1000到1000。投影矩陣接着會將在這個指定的範圍內的座標變換爲標準化設備座標的範圍(-1.0, 1.0)。所有在範圍外的座標不會被映射到在-1.0到1.0的範圍之間,所以會被裁剪掉。在上面這個投影矩陣所指定的範圍內,座標(1250, 500, 750)將是不可見的,這是由於它的x座標超出了範圍,它被轉化爲一個大於1.0的標準化設備座標,所以被裁剪掉了。

如果只是圖元(Primitive),例如三角形,的一部分超出了裁剪體積(Clipping Volume),則OpenGL會重新構建這個三角形爲一個或多個三角形讓其能夠適合這個裁剪範圍。

由投影矩陣創建的觀察箱(Viewing Box)被稱爲平截頭體(Frustum),每個出現在平截頭體範圍內的座標都會最終出現在用戶的屏幕上。將特定範圍內的座標轉化到標準化設備座標系的過程(而且它很容易被映射到2D觀察空間座標)被稱之爲投影(Projection),因爲使用投影矩陣能將3D座標投影(Project)到很容易映射到2D的標準化設備座標系中。

一旦所有頂點被變換到裁剪空間,最終的操作——透視除法(Perspective Division)將會執行,在這個過程中我們將位置向量的x,y,z分量分別除以向量的齊次w分量;透視除法是將4D裁剪空間座標變換爲3D標準化設備座標的過程。這一步會在每一個頂點着色器運行的最後被自動執行。

在這一階段之後,最終的座標將會被映射到屏幕空間中(使用glViewport中的設定),並被變換成片段。

將觀察座標變換爲裁剪座標的投影矩陣可以爲兩種不同的形式,每種形式都定義了不同的平截頭體。我們可以選擇創建一個正射投影矩陣(Orthographic Projection Matrix)或一個透視投影矩陣(Perspective Projection Matrix)。


lookat矩陣


然後呢?

頂點着色器的輸出要求所有的頂點都在裁剪空間內,這正是我們剛纔使用變換矩陣所做的。OpenGL然後對裁剪座標執行透視除法從而將它們變換到標準化設備座標。OpenGL會使用glViewPort內部的參數來將標準化設備座標映射到屏幕座標,每個座標都關聯了一個屏幕上的點(在我們的例子中是一個800x600的屏幕)。這個過程稱爲視口變換。



-----------------------------------------------------------------------------------------------------------------------------------------

下面是opengl備忘錄及注意事項:

表示畫出圖形的模式.
GL_LINES會把點1和點2,點3和點4依次類推連接起來,要指定glLineWidt,點數足夠多的情況下會畫出一個虛邊圓或者實邊圓;
GL_LINE_LOOP會畫出一個未被填充的圖形,只有邊緣,要指定glLineWidt;

GL_POLYGON會畫出一個填充的多邊形;

GL_POINTS只顯示點.


http://blog.csdn.net/a358333644/article/details/50780130


特別要注意這個方向,之前沒有注意出現了許多莫名其妙的鏤空處.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章