1. 程式人生 > >計算機圖形學實驗教程(OpenGL)

計算機圖形學實驗教程(OpenGL)

 第一章

1.OpenGL會利用插值演算法將3個頂點連成三角形 

2.OpenGL中的陰暗處理有兩種模式:GL_SMOOTH、GL_FLAT。

       GL_SMOOTH: OpenGL將根據頂點的顏色,插值生成其他點的顏色,形成顏色漸變、過渡的效果。

      GL_FLAT: 沒有顏色漸變和過渡的效果。例如:對三角形單調著色,取最後一個頂點的顏色填充三角形。

3.glColor3ub(): 引數型別為GLubyte,範圍為[0,255]

   glColor3f():   引數型別為GLfloat,範圍為[0.0f,1.0f] .glColor3f()中的引數大於1.0f時,OpenGL會將引數值鉗位至 1.0f。

    兩者的功能相同。例如:glColor3ub(51,255,0)和glColor3f(0.2f,1.0f,0.0f)定義了相同的顏色。

4.設定色差可以使物體的3D效果更明顯。例如:金字塔兩側面的顏色較深,前後面的顏色較淺,可使觀察者產生錯覺,凸現3D效果。

5.void auxSolidBox(GLdouble width,GLdouble height,GLdouble depth) //繪製長方體

6.頂點的繪製順序只是會影響到面的法線方向的確定。GLFrontFace(GL_CW)和glFrontFace(GL_CCW)(預設)

可以決定順時針還是逆時針的一面為正面。

7。glPushMatrix(), glPopMatrix();可以在繪製多個物體時,方便地控制各個物體的座標。

8。void glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z)

      angle:旋轉的角度,向量(x,y,z)所在的直線表示轉軸。該函式將當前座標系繞(x,y,z)軸逆時針旋轉angle角度。

9。

  #pragma comment( lib, "opengl32.lib" )         // 連結時查詢OpenGL32.lib
              #pragma comment( lib, "glu32.lib" )          // 連結時查詢glu32.lib
             #pragma comment( lib, "glaux.lib" ) 

10。怎樣在繪製多個物體時控制各個物體的座標?

      有三種方法:(1)人工進行逆操作:繪製一個物體時執行了什麼樣的座標操作,在繪製下一個物體之前再執行依次反操作即可.比如:繪製一個物體時繞X軸旋轉了xrot角度,則在繪製下一個物體之前把座標系轉-xrot角度即可.

     (2)若待繪製的多個物體之間的座標沒有關聯,那麼每次繪製物體前先用glLoadIdentity()重置ModelView Matrix(模型檢視矩陣)即可.

   (3)用glPushMatrix()與glPopMatrix()將ModelViewMatrix壓棧和出棧.同時我們可以巢狀呼叫glPushMatrix()與glPopMatrix()函式來繪製更加複雜的物體.

注意:千萬不要把glRotatef()寫在glBegin()與glEnd()之間.這樣能夠通過編譯,但無法實現旋轉的效果,並且會產生GL_INVALID_OPERATION的異常.

 11.現有的紋理貼圖就是將各種不同的2D平面圖形貼在3D物體的表面上.

AUX_RGBImageRec* LoadImage(char* filename)

  LoadImage()載入BMP圖片,並返回AUX_RGBImageRec指標,

Bool LoadTextureGL()

     將載入的BMP圖片轉為紋理

12.auxDIBImageLoad()載入圖片並返回指標.注意載入圖片的寬和高必須是2的n次方,其寬度和高度最小不得小於64象素,圖象的寬度和高度不應超過256象訴素.換句話說,圖片必須為64*64,128*128,256*256

gluBuild2DMipmaps()代替glTexImage2D(),這樣可以載入任意大小的圖片

13.glTexImage2D()生成2D紋理圖象,

第一個引數必須為GL_TEXTURE_2D;

第二個引數0表示細節的級別;

第三個引數表示圖素的顏色通道,載入的圖片只有RGB三色,所以為3;

第四、五兩個引數分別表示紋理的寬度和高度;

第六個引數0表示邊框寬度,

第七個引數GL_RGB表示象素資料格式;

第八個引數GL_UNSIGNED_BYTE表示組成圖象的資料型別為unsigned byte;

第九個引數為紋理資料的來源。

14。glTexParameteri()用來指定濾波方式。

       GL_TEXTURE_MIN_FILTER指定縮小紋理的濾波方式,用於大紋理貼到小表面的情形;

     GL_TEXTURE_MAG_FILTER指定放大紋理的濾波方式,用於小紋理貼到大表面的情形

   GL_LINEAR將紋理濾波方式設為線形內插

15。在金字塔的各個三角形側面貼上相同的紋理。

        在紋理上擷取一個三角形區域,作為三角形側面的貼圖。

      通過改變glTexcoord2f()中的兩個引數的值來擷取紋理的不同區域。

    三角形的左下頂點------紋理的左下角圖素(0.0,0.0)

   三角形的右下頂點------紋理的右下角圖素(1.0,0.0)

    三角形的上頂點------紋理頂部的中點圖素(0.5,1.0)

16.auxSolidSphere()函式是以座標系原點為球心繪製球的,所以在繪製球之前必須先移動座標系.

    auxSolidCylinder()函式的作用是在Y軸方向上繪製所要求的圓柱.由於程式中繪製的四個圓柱並不都是垂直於XZ平面的,所以在繪製後面兩個圓柱前需要先將座標系繞Z軸旋轉90度.

auxSolidCylinder()繪製的圓柱的上底面是固定的,而且是固定在當前座標系中y=1.0f的平面上,以y軸為軸,隨著指定高度的不同不斷地向y軸負方向延伸.

17.glRotatef()只使物體繞過原點的直線旋轉,所以首先要把座標系移到這個側面的旋轉軸上.

18.如果程式開啟GL_2D_TEXTURE後,既沒有給圖元指定顏色也不繫結紋理,那麼OpenGL將會自動使用所用紋理邊緣所有圖素混合後的顏色給圖元著色.

19.gluSphere(quadric,0.3f,32,32)用來繪製一個球體.

     第一個引數是一個指向二次曲面物件的指標;

   第二個引數是球體的半徑;

   第三、四個引數是所繪製球體的細節和詳細程度,數值越大,球體越精細。

20。怎樣實現如太陽等發光物體的光暈效果,一種簡單的辦法是用一個透明的面片來模擬,另外也可以通過繪製漸變的射線面來實現。

21。齊次座標(x,y,z,w)表示的3D座標(x/w,y/w,z/w).若w=0表示座標在(x,y,z)方向上的無窮遠處。即為平行光。

22。OpenGL裡面有GL_LIGHTi(i=0,1,2,....7)共8盞燈。GL_LIGHTING是所有燈的開關。

23。由於設定了各個側面的法向量,立方體各個表面就會根據光源進行正確的著色。若不定義,就無法有正確的光照效果。

24。glFogi(GL_FOG_MODE,fogMode[filter])設定霧的濾波方式。其中filter允許程式在不同的濾波方式之間切換。OpenGL提供了三種濾波方式

        (1)GL_EXP濾波:簡單渲染螢幕上的霧。用這種濾波方式不能渲染出很漂亮的霧,但在配置比較低的計算機上執行良好。一般用於大霧或雲的效果。

        (2)GL_EXP2濾波:霧效果比GL_EXP好一些。一般用於煙和薄霧的效果。

       (3)GL_LINEAR濾波:最好的濾波方式,物體在霧中消隱得很好,具有深度感。

glFogfv(GL_FOG_COLOR,fogColor)設定霧的顏色為fogColor

glFogf(GL_FOG_DENSITY,0.35f)設定霧的濃度為0.35f.濃度值可設在0。0~1。0之間,值越大霧越濃,值越小霧越淡。

25.  glHint(GL_FOG_HINT,GL_DONT_CARE)確定霧的渲染方式,函式的第二個引數是可選的

      (1)GL_DONT_CARE是讓OpenGL自己選擇渲染方式,只渲染每個頂點或者每個象素都渲染

     (2)GL_DONT_NICEST是對每個象素進行渲染,效果比較好;

     (3)GL_FASTET是對每個頂點進行渲染,頂點之間的畫素由直接插值得到,速度較快,但效果相對較差。

第三章

  1.glPrint();//在螢幕上顯示資訊

  glRasterPos2f();//用以定位一行文字的位置

2.設定材質的顏色有幾種方法:

   (1)glMaterialfv()來設定材質屬性,但系統性能開銷相當大

  (2)void glColorMaterial(GLenum face,GLenum mode);

     其中,face指定待更改的面(GL_FRONT,GL_BACK,GL_FRONT_AND_BACK)

             mode指定材質成分(GL_AMBIENT,GL_DIFFUSE,GL_AMBIENT_AND_DIFFUSE,GL_SPECULAR,GL_EMISSION)

3.顯示錶不能巢狀定義,即不能在一個顯示錶內部建立另一個顯示錶.但是在建立顯示錶時,OPenGL允許新的顯示錶呼叫在這之前已經建立好的顯示錶.

 第四章

   在OpenGL裡面,除了可以用glTexCoord()指定紋理座標外,還可以用glTexGen*()自動生成紋理座標,該函式在顯示輪廓線、環境影射等許多方面都很有用。