(x,y,z):組合起來表示兩個重要的值,一個是方向,一個是向量
多邊形面積公式:
float s = 0.0;
for(i=0; i<n; i++)
{
s += (point[i].x*point[(i+1)%n].y+point[(i+1)%n].x*point[i].y)/2;
}
逆時針給予點 A是正面的面積 A>0
順時針給予點 A是背面的面積 A<0
AB + BC = AC
AB - AC = CB 共同起點指向被減
已知兩個非零向量A,B 作 OA=A OB=B 則角AOB稱爲向量A和向量B的夾角
記作 <A,B> 並規定 0<= <A,B> <= 180(大於等於0度,小於等於180)
A*B = |A|*|B|*COS<A,B>
兩個向量的數量積:
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,B>
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中
圖元裝配階段將這些頂點與相關的幾何圖元之間組織起來
剪切:
頂點可能會落在視口之外,也就是我們可以進行繪製的框口區域,
此時與頂點相關的圖元會做出改動,以保證相關的像素不會在視
口外繪製
光柵化: 將更新後的圖元傳遞給光柵化單元生成對應的片元我們
可以將一個片元視爲一個候選像素
片元着色器:
最後一個可以通過編程控制屏幕上顯示顏色的階段
我們使用着色器計算片元的最終顏色
頂點着色器(包括細分和幾何)決定圖元應該位於屏幕的什麼位置
片元着色器使用這些信息決定某個片原的顏色是什麼
逐片元操作:
片元操作的下一步就是最後的獨立片元處理過程
在這個階段裏會使用深度測試和模板測試的方式來決定一個片元是否是可見的