OpenGL筆記-4.基礎變化

抗鋸齒

   抗鋸齒是混合的一個實際用法,先說下鋸齒,再說抗鋸齒,一般來說是照片或者遊戲就會有鋸齒,但是當分辨率足夠大的照片或者貼圖在相對小的取景框(或者說屏幕,或者界面),則鋸齒就看起來不明顯,相反的話就會很嚴重,在嚴重的情況下就需要抗鋸齒了,但是抗鋸齒只能減輕鋸齒效果,不可能完全解決問題,所以叫抗鋸齒,不是解決鋸齒

   首先說鋸齒是怎麼產生的,如果一張圖是2k的,剛好顯示在2k的屏幕上, 每一個像素點都有對應的顏色,所以一點都不會失真,但如果放到4k屏來顯示就會有一點點失真了,原因是因爲對應的像素點沒有內容了,所以都會用白色或者其它顏色來填充,抗鋸齒的原理就是把兩個像素的邊緣混合一下,就使得過渡沒有那麼的突兀,不是直接顯示的內種

   開啓代碼也十分簡單

   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  

   glEnable(GL_BLEND);  //開啓混合

   glEnable(GL_POINT_SMOOTH);   //對點進行平滑處理

   glEnable(GL_LINE_SMOOTH);   //對線進行平滑處理

   glEnable(GL_POLYGON_SMOOTH);  //對多邊形進行平滑處理

   關閉代碼爲對應的glDisable

   但其實通過看原理就知道這個破玩意兒在點線還好,處理多邊形可能就有一點麻煩,因爲一般來說多邊形都是多個圖元組成的,每個圖元都處理,就有一點麻煩了,所以一般多邊形都是多重採樣

   上面的混合操作也包含了多重採樣GL_ONE_MINUS_SRC_ALPHA這個就是,代碼很簡單,glEnable(GLUT_MULTISAMPLE);和對應的disable來關閉,值得注意的是,需要在glut的初始化代碼裏面加入GLUT_MULTISAMPLE

矩陣和向量

   先說向量,比如一個點在笛卡爾座標系裏面,是x,y或者在三維裏面是x,y,z,那麼它對應的原點就有一個向量,這個向量就有了三個值,方向(角度),位置(座標)和長度(數量),而一般長度爲1的就叫標準向量,這個過程叫標準化

   在OpenGL裏面的函數對應爲,typedef float M3DVector3f[3];是一個一位數組,也是個三維向量,一般使用的話這個值是[x,y,z,x1,y1,z1...]這種類型,或者typedef float M3DVector4f[4];這種除了在(x,y,z)的基礎上加一個w,w可以表示顏色,準確說是一個屬性,該點的某個屬性

   向多個標準向量之間就一定會有點乘,俗話所說的夾角inline float m3dGetAngleBetweenVectors3(const M3DVector3f u, const M3DVector3f v),函數是這樣,返回的結果是一個弧度並不是角度值,轉角度值也挺容易就是這個值V 除以π乘以180 比如代碼(v3 / M3D_PI * 180),值得注意的是這裏只能處理單位向量!!!!

    叉乘   點乘得到夾角,叉乘則會得到一個同時垂直於兩個向量的第三個向量,或者說垂直於這兩個向量所屬平面的第三個向量,也不需要自己算,有函數 

inline void m3dCrossProduct3(M3DVector3f result, const M3DVector3f u, const M3DVector3f v)

{

result[0] = u[1]*v[2] - v[1]*u[2];

result[1] = -u[0]*v[2] + v[0]*u[2];

result[2] = u[0]*v[1] - v[0]*u[1];

}直接寫好了,其中需要自己定義一個空的M3DVector3f,作爲接受者,然後定義兩個向量算出點乘,這裏並不需要單位向量,並且U ,V的位置不可顛倒,否則就是另一個方向的向量了,這裏並不需要一定是單位向量

矩陣在OpenGL中的作用

      投影 說矩陣之前先說說投影,投影是啥,常見理解就是把一個內容投影到一個屏幕,或者把一個畫面通過某種方式放到另一個畫面上,比如拿3D來說,創建的是x,y,z的三個座標系,理論上是個3D的,但手機是個2d平面,這是沒法顯示的,而把3D圖形轉換到手機平面上顯示的這一功能就叫投影,比如平面投影,就是直接把3d效果進行2D化,然後顯示,並沒有太多其它操作,再比如透視投影,在2D化的基礎上,加了遠近大小的概念,使得3D圖形更加立體逼真

      視圖,就是照相機的位置,或者說觀察者的位置,注意不是看屏幕的時候眼睛的位置,可能這個觀察者在設置上就是平時看屏幕的位置,但實際你偏一下腦袋觀察者的位置也不會變,並且整個視圖是可以變化的,比如有時候看見模型移動,實際上是視圖在移動,模型沒變

      模型 場景中移動或者變化的物體就是模型  

      模型視圖 描述視圖和模型的變化,比如旋轉啊平移啊, 那兩者變化可以是物體變化,也可以是觀察者,也就是視圖的變化

      嗶嗶了這麼多和矩陣有個球關係啊,上面不管是投影還是視圖,還是模型還是模型視圖,都提到了個很重要的詞,叫做變化,平移也算變化,旋轉也算變化,這個變化是怎麼來的,然後透視投影裏邊兒,z值大的物體會顯示的比較小,這一系列的變化,究竟腫麼完成的,隨便舉個例子吧比如一個物體的所有圖元的頂點都用[x,y,z,w]來表示,那麼我要將這個圖形所有值x軸移動x/2的距離,y,z和w不變,那麼將它上面所有的頂點乘以一個這樣的矩陣$$ \begin{matrix} 0.5 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \tag{1} $$,那麼所有的x值都會減少0.5,也就是完成了變化裏面的平移操作,這個就是單x軸的平移如果是旋轉的話就需要設計映射了,就不會是隨手寫的矩陣了,但一般都是4*4的矩陣,只是取值會更復雜一些,值得注意的一點是:在數學表達式上面,矩陣一般都是這樣表示的$$ \begin{matrix} A1 & A2 & A3 \\ A4 & A5 & A6 \\ A7 & A8 & A9 \end{matrix} \tag{1} $$,但是在計算機裏邊兒卻不是,而是豎直表示的$$ \begin{matrix} A1 & A4 & A7 \\ A2 & A5 & A8 \\ A3 & A6 & A9 \end{matrix} \tag{1} $$,這是因爲計算機裏面還是用線性的一維數組來表示矩陣的,比如[x,y,z]矩陣乘以一個上述矩陣,那麼先相乘的是x*A1 + y*A4 + Z*A7,所以如果用常規的數學方式表示,那麼計算效率會大大的降低,既然都用OpenGL來寫圖形了當然是考慮到了性能的問題,否則直接用圖片的幀動畫不就完了麼

OpenGL的矩陣和矩陣運算的代碼實現

     M3DVector4f v44;   //創建一個4*4的矩陣

    m3dLoadIdentity44(v44);   //把4*4的矩陣加載成單元矩陣(單元矩陣就是相乘不會產生變化的矩陣)

inline void m3dTranslationMatrix44(M3DMatrix44f m, float x, float y, float z)這是個平移代碼,其中m是需要平移的矩陣,x,y,z爲偏移量

void m3dRotationMatrix44(M3DMatrix44f m, float angle, float x, float y, float z); 這個是旋轉代碼,x,y,z表示是否旋轉一般是傳1或者0,而angle是弧度,不是角度,比如旋轉60度 (60/180 * π)就是弧度了

inline void m3dScaleVector4(M3DVector4f v, const float scale) { v[0] *= scale; v[1] *= scale; v[2] *= scale; v[3] *= scale; } 縮放源碼挺簡單的,就是把傳入的矩陣所有值都進行縮放

正投影和透視投影

   要說正投影和透視投影有啥區別就真沒啥好說的,主要就是在3D圖形上邊,正投影比較平面,3D失真厲害,透視則很3D,後續單獨寫篇筆記吧,比較複雜   

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