openGL學習筆記(2)

2021-10-04 18:13:04 字數 4530 閱讀 9331

(x,y,z):組合起來表示兩個重要的值,乙個是方向,乙個是向量

多邊形面積公式:

float s = 0.0;

for(i=0; i0

順時針給予點 a是背面的面積 a<0

ab + bc = ac

ab - ac = cb  共同起點指向被減

已知兩個非零向量a,b 作 oa=a ob=b 則角aob稱為向量a和向量b的夾角

記作 並規定 0<= <= 180(大於等於0度,小於等於180)

a*b = |a|*|b|*cos

兩個向量的數量積:

a*b = b*a

(a+b)+c = a+(b+c)

|a*b| 小於等於 |a|*|b|  (三角形)

(a*b)*c 不等於 a*(b*c)

(a*b)平方 不等於 a的平方* b的平方

由 a*b = a*c (a不為0) 推不出 b=c

(b和c共線的時候不成立)

兩個向量的向量積:

a x b 若 a和b 不共線  |a x b| = |a|*|b|*sin

a x b 的方向是垂直於 a 和 b  右手系

opengl 變換術語:

檢視 : 指定觀察者或者照相機的位置

模型 : 在場景中移動的物體

模型檢視:描述檢視和模型變換的二元性

投影:改變視景體的大小或重新設定它的形狀

視口:這是一種偽變換,只是對框口上的最終輸出進行縮放。

檢視變換:

檢視變換是應用到場景中的第一變換它用來確定場景中的有利位置

在正投影中觀察者被認為在z軸正方向無窮遠的位置,能夠看到視景體

中任何東西    

檢視變換允許我們把觀察點放在所希望的任何位置,並允許在任何方向

上觀察場景

確定檢視變換就像在場景中放置照相機並讓它指向某個方向

從大局上考慮在應用任何其他模型變換之前,必須先應用檢視變換這樣做是

因為對視覺座標而言,檢視變換移動了當前的工作座標,所有後續變換隨後

都會基於新調整的座標系進行。然後在實際開始考慮如何進行變換時,就會

更容易地看到這些變換是如何實現的了

模型變換:

模型變換用於操縱模型和其中的特定物件,這些變換將物件移動到需要的位置

然後再對他們進行旋轉和縮放。

模型檢視二元性:

實際上檢視和模型變換按照它們內部效果和對場景的最終外觀來說是一樣的

將這兩個區分開來純粹是為了程式設計師方便

將物件向後移和將參考座標向前一移在視覺上沒有區別

檢視變換和模型變換一樣都應用在整個場景中,在場景中物件常常先進行

檢視變換後單獨進行模型變換

模型檢視:是指這兩種變換在變換管線中進行組合,成為乙個單獨的矩陣

即模型檢視矩陣

投影變換:

這種投影實際上定義了視景體並建立了剪下平面

剪下平面是3d空間中的平面方程式,opengl用它來確定幾何圖形對於觀察者

來說是否可見

投影變換指定乙個完成的場景(所有模型變換都已完成)是如何投影到螢幕上的

最終影象

視口變換:

投影變換完成後,就得到乙個場景的二維投影,它將被對映到螢幕上某處的

視窗上,這種到物理視窗的對映是我們最後要做的變換稱為視口變換

幸運的是我們不必為這是操心,圖形硬體會為我們做好這些

模型檢視矩陣:

模型檢視矩陣是乙個4x4矩陣

頂點資料實際上是4個元素其中包含乙個附加值 w  它表示縮放因子

預設情況下這個值被設定為1.0

在數學中行優先矩陣和列優先矩陣互為轉置矩陣

x1    y1    z1    t1

x2    y2    z2    t2

x3    y3    z3    t3

0    0    0    0

前三列的前3個元素只是方向向量 他們表示空間中

x軸(x1、x2、x3)、y軸(y1、y2、y3)、z軸(z1、z2、z3)上的方向

第四列向量包含變換後的座標系原點的x,y, z的值

最奇妙的是如果有乙個包含了乙個不同座標系的位置和方向的4x4矩陣

然後用乙個表示原來座標系的向量,乘以這個矩陣得到的結果是乙個轉

到新座標系下的新向量

這就意味著空間中任何位置和任何想要的方向都可以由乙個4x4矩陣唯一

確定並且如果使物件的所有向量乘以這個矩陣那麼我們就將整個物件變換

到空間中的給定位置和方向

旋轉、平移將這兩個變化加在一起造作很簡單,只需要兩個矩陣相稱

相乘時運算的順序是有影響的

eg、乙個旋轉矩陣乘以乙個平移矩陣,與乙個平移矩陣乘以乙個旋轉矩陣是不同的

投影矩陣:

模型檢視矩陣實際上是在視覺座標中移動幾何圖形到目前為止,我們已經在螢幕上

使用了範圍為-1到+1(實際上沿z軸方向範圍也是-1到+1)的預設座標系。事實上

這個小小的座標範圍確實是硬體唯一能夠接受的

那麼使用不同座標系的技巧就是將我們想要的座標系變換到這個單位立方體中

我們使用新的矩陣來完成這項工作,就是投影投影矩陣

變換管線    :

初始頂點資料            變換的視覺座標                     剪裁座標

x                    模型                x1                 投影                 x2

y    ==》       檢視    ==》   y1        ==》              ==》  y2

z                     矩陣                z1                 矩陣                z2

w                                            w1                                         w2

規範化的裝置座標                                          視窗座標

透視                      x2/w2                          視口            

==》               ==》     y2/w2                ==》            ==》 螢幕上顯示圖形

除法                      z2/w2                          變換

裁剪座標值位於我們前面提到的+/-1.0單位座標系內,將有效地將所有位於

這個裁剪空間之外的資料消除掉

裁剪座標隨後再除以w座標生成規範化的裝置座標,其中w值可能會被投影矩陣

或者模型矩陣修改這取決於發生的變換

座標三元組將通過視口變換被對映到2d平面上這項操作也是由乙個矩陣來表示

但是不能直接指定或者修改這個矩陣。

opengl將在內部根據指定的glviewport的值來設定這個矩陣。

畫素包裝:

影象資料在記憶體中很少以緊密包裝的形式存在

在許多硬體平台上出於效能上的考慮一幅影象的每一行都應從一種

特定的位元組對齊位址開始

在預設情況下opengl採用4個位元組的對齊方式,這種方式適合於很多

目前正在使用的系統

如果不採用4個位元組對其,可能會在後面的工作中導致某些很難發現

的與記憶體相關的奇怪bug,這可能會讓我們焦頭爛額。雖然這個看起來

可能像是一種儲存空間的浪費,但是這種排列能夠讓大多數cpu更高效

的獲取資料塊

改變或恢復畫素儲存方式:glpixelstoref(...)

頂點著色器:

執行大量的計算得到頂點在螢幕上的位置

乙個複雜的應用程式可能包含許多個頂點著色器,但是同一時刻

只能由乙個頂點著色器起作用

細分著色器:

頂點著色器處理每個頂點的關聯資料後,如果同時啟用了細分著色器

那麼它將進一步處理這些資料

細分著色器會使用patch來描述乙個物體的形狀,並使用相對簡單的

patch幾何體來完成細分的工作,其結果是幾何圖元的數量增加,並且

模型的外觀變得更加平滑。    

幾何著色器:

允許在光柵化之前對圖元做進一步處理,eg、建立新圖元

圖元裝配:

頂點、細分、幾何著色器所處理的都是頂點資料,此外這些頂點之間

如何構成幾何圖元的所有資訊也會被傳遞到opengl中

圖元裝配階段將這些頂點與相關的幾何圖元之間組織起來

剪下:頂點可能會落在視口之外,也就是我們可以進行繪製的框口區域,

此時與頂點相關的圖元會做出改動,以保證相關的畫素不會在視

口外繪製

光柵化: 將更新後的圖元傳遞給光柵化單元生成對應的片元我們

可以將乙個片元視為乙個候選畫素

片元著色器:

最後乙個可以通過程式設計控制螢幕上顯示顏色的階段

我們使用著色器計算片元的最終顏色

頂點著色器(包括細分和幾何)決定圖元應該位於螢幕的什麼位置

片元著色器使用這些資訊決定某個片原的顏色是什麼

openGL 學習筆記 2

藍寶書 第二章 1 windows平台使用標頭檔案 根據環境不同會有變化 include include include 2 opengl變數型別與c語言變數型別對應表 表2.1 第81頁 3 api函式命名規則 庫字首 根命令 引數數量 引數型別 glcolor3f 4 常見rgb復合顏色表 表2...

openGL學習筆記2(顏色)

opengl支援兩種顏色模式 一種是rgba,一種是顏色索引模式。無論哪種顏色模式,計算機都必須為每乙個畫素儲存一些資料。不同的是,rgba模式中,資料直接就代表了顏色 而顏色索引模式中,資料代表的是乙個索引,要得到真正的顏色,還必須去查索引表。ex void mydisplay void glco...

OpenGL學習筆記

我是一名ios開發者,opengl是乙個比較重要的技術。所以就此開啟我的菜鳥之路。opengl open graphics library 是乙個跨程式設計語 言 跨平台的程式設計圖形程式接 它將計算機的資源抽象稱為乙個個opengl的物件,對這些資源的操作抽象為乙個的opengl指令.direct...