OpenGL初學

//清除屏幕到之前指定的顏色, 清除深度緩存,Clear The Screen And The Depth Buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//重置場景 (譯註:就是重置當前視圖模型矩陣) ,Reset The Current Model view Matrix
glLoadIdentity();

// glTranslatef(x, y, z) 的功能是沿 X軸,Y軸和Z軸 做移動。 下面的代碼在X軸上向左移動了1.5個單位, Y 軸上沒有移動(0.0), Z 軸上向屏幕裏面移動了 6.0個單位。 注意當你做移動的時候你是相對於當前位置做的, 而不是屏幕(場景)中心位置。
glTranslatef(-1.5f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0

//glRotatef(Angle,Xvector,Yvector,Zvector) 用於繞軸旋轉物體, 這是一條十分有用的函數。 Angle 是一個用於指定旋轉角度的數字(通常存儲於變量中)。 Xvector, Yvector 和 Zvector 這三個參數用於描述一條向量, 以規定物體的旋轉軸。 如果你使用 (1,0,0) 這樣的值, 你就描述了一條長度爲1個單位的、順着x軸指向右方的向量; 而 (-1,0,0) 這樣的值就描述了一條長度爲1個單位的、順着x軸 但指向左方的向量。
//爲了更好地理解 X, Y 和 Z 旋轉, 這裏舉一些例子……
//X 軸 – 你正在使用一臺臺鋸, 木頭穿過鋸刀的中心。 鋸刀在x軸上飛速旋轉, 刀齒看起來是向上切或者向下切, 這取決於鋸刀的旋轉方向。 這、在OpenGL中以x軸旋轉物體相類似。
//Y 軸 – 想象一下, 原野上掛起了龍捲風。 龍捲風的中心正處於y軸上, 它颳起的泥土還有碎片正繞着y軸 (龍捲風的中心) 旋轉着, 從左到右或從右到左。 這與在OpenGL中以y軸旋轉物體相類似。
//Z 軸 – 你正看着一臺旋轉着的電風扇, 電風扇的中心點面向着你。 電風扇的扇片繞着z軸旋轉, 順時針或逆時針方向。這與在OpenGL中以z軸旋轉物體相/類似。
//所以, 在下面的這行代碼中, 如果 rtri 等於 7的話, 我們將在y軸上旋轉7度 (從左到右)。 你可以試着修改代碼, 使三角形在x和y軸上同時旋轉。注意旋轉是按照角度的(譯註:不是弧度), 如果rtri 的值爲 10, 我們將在y軸上旋轉 10度。

glRotatef(rtri,0.0f,1.0f,0.0f); // Rotate The Triangle On The Y axis ( NEW )
//這裏沒有聲明rtri,需要先聲明rtri,若要實現動態旋轉可以在繪圖函數中加入rtri+=0.2f;或者rtri-=0.14f;之類的語句

//在這個簡單的程序中我們只繪製一個三角形。 如果想再增加一個三角形, 我們就需要增加3行代碼(3個頂點) 到原來的3行代碼後面, 這樣在glBegin(GL_TRIANGLES) 和 glEnd() 之間就會有6行代碼了。 在glBegin(GL_TRIANGLES) 和glEnd() 之間應該是3個點爲一組的, 多餘的點會被忽略。 同樣的道理也適用於4邊形, 如果你繪製的都是4邊形的話, 要增加另一個四邊形你就需要在原來的4行代碼的後面再添加一組4行代碼。 而一個多邊形(polygon) 可由任意數目的頂點組成, 所以在glBegin(GL_POLYGON) 和glEnd() 之間可以有任意行代碼。

//glBegin 後面的第一行代碼爲我們的三角形設置第一個頂點, glVertex 的第一個參數指定頂點的X座標, 第二個參數指定Y座標, 而第三個指定 Z 座標。 所以, glBegin(GL_TRIANGLES) 後面的三行代碼分別指定了三角形上面的頂點, 左下角的頂點 和 右下角的頂點。 然後, glEnd() 告知 OpenGL已經沒有頂點了。 這樣, 一個封閉的三角形就完成了。以順時針的順序, 我們將繪製出四邊形的背面, 也可以說實際上我們看到的是它的背面。 物體沿逆時針順序被繪製的話就會以正面面向我們。

glBegin(GL_TRIANGLES); // Drawing Using Triangles (四邊形:GL_QUADS,直線:GL_LINES,多邊形,GL_POLYGON)

//我們將當前顏色設置爲紅色(紅色亮度滿,沒有綠和藍)。 接下來的代碼是第一個頂點(三角形上面的), 我們將以紅色作爲當前顏色來進行繪製。 從現在開始如果我們不改變當前顏色, 那麼繪製什麼都將是紅色的。
glColor3f(1.0f,0.0f,0.0f); // Set The Color To Red

glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glEnd(); // Finished Drawing The Triangle

 

1、初始化OpenGL繪圖環境

  1.1 定義顏色格式和緩衝模式
  OpenGL提供兩種顏色模式:RGB(RGBA)模式和顏色索引模式(調色板)。在RGBA模式下所有顏色的定義用RGB三個值來表示,有時也加上Alpha值(表示透明度)。RGB三個分量值的範圍都在0和1之間,它們在最終顏色中所佔的比例與它們的值成正比。如:(1、1、0)表示黃色,(0、0、1)表示藍色。顏色索引模式下每個象素的顏色是用顏色索引表中的某個顏色索引值表示(類似於從調色板中選取顏色)。由於三維圖形處理中要求顏色靈活,而且在陰影,光照,霧化,融合等效果處理中RGBA的效果要比顏色索引模式好,所以,在編程時大多采用RGBA模式。
  OpenGL提供了雙緩存來繪製圖像。即在顯示前臺緩存中的圖像同時,後臺緩存繪製第二幅圖像。當後臺繪製完成後,後臺緩存中的圖像就顯示出來,此時原來的前臺緩存開始繪製第三幅圖像,如此循環往復,以增加圖像的輸出速度。
  設置窗口顯示模式函數:

  void auxInitDisplayMode(
    AUX_DOUBLE |
  // 雙緩存方式
    AUX_RGBA     // RGBA顏色模式
  );

  1.2 設置光源
  OpenGL的光源大體分爲三種:環境光(Ambient light),即來自於周圍環境沒有固定方向的光。漫射光(Diffuse light)來自同一個方向,照射到物體表面時在物體的各個方向上均勻發散。鏡面光(Specular light)則是來自於同一方向,也沿同一個方向反射。全局環境光是一種特殊的環境光,它不來自特於某種定光源,通常做爲場景的自然光源。
  指定光源函數:

  void glLightfv(
    Glenum light,
  // 光源號
    Glenum pname,  // 指明光源類型:
             // GL_DIFFUSE 光源爲漫射光光源
             // GL_AMBIENT 光源爲環境光光源
             // GL_SPECULAR 光源爲鏡面光光源

    const Glfloat* params  // 指向顏色向量的指針
  );

  設置全局環境光函數:

  void glLightModelfv(
    GL_LIGHT_MODEL_ AMBIENT,
    const Glfloat* param
  // param:指向顏色向量的指針
  );

  起用光源函數:

  void glEnable(GL_LIGHTING);
  void glEnable(GL_enum cap);
  // cap:指明光源號

  1.3 設置材質
  在OpenGL中,用材料對光的三原色(紅綠藍)的反射率大小來定義材料的顏色。與光源相對應,材料的顏色,也分爲環境色,漫反射色和鏡面反射色,由此決定該材料對應不同的光呈現出不同的反射率。由於人所看到物體的顏色是光源發出的光經物體反射後進入眼睛的顏色。所以,物體的顏色是光源的環境光,漫反射光和鏡面反射光與材料的環境色,漫反射色和鏡面反射色的綜合。例如:OpenGL的光源色是(LR、LG、LB),材質色爲(MR、MG、MB),那麼,在忽略其他反射效果的情況下,最終進入眼睛的顏色是(LR*MR、LG*MG、LB*MB)。
  材質定義函數:

  void glMaterialfv(
    GLenum face,
  // 指明在設置材質的哪個表面的顏色。
            // 可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK

    GLenum pname,  // 與光源的pname參數相似
    const float* params  // 指向材質的顏色向量
  );

  1.4 定義投影方式
  也即選擇觀察物體的角度和範圍。由於我們是三維繪圖,所以採用不同的視點和觀察範圍,就會產生不同的觀察效果。由於計算機只能顯示二維圖形,所以在表示真實世界中的三維圖形時,需將三維視景轉換成二維視景。這是產生三維立體效果的關鍵。OpenGL提供了兩種將3D圖形轉換成2D圖形的方式。正投影(Orthographic Projection)和透視投影(Perspective Projection)。其中,正投影指投影后物體的大小與視點的遠近無關,通常用於CAD設計;而透視投影則符合人的心理習慣,離視點近的物體大,離視點遠的物體小。此外,在OpenGL中還要定義投影範圍,只有在該範圍中的物體纔會被投射到計算機屏幕上,投影範圍外的物體將被裁減掉。
  定義投影範圍(不同的投影方式對應不同函數):

  void glOrtho(
    GLdouble left, GLdouble right,
  // (left,bottom,near)及(right,top,far)分別給出正射投
    GLdouble bottom, GLdouble top,  // 影投影範圍的左下角和右上角的座標。
    GLdouble near,GLdouble far);

2、定義與Windows接口的系統函數

  2.1 定義繪圖窗口的位置

  // (x,y)給出窗口左上角座標
  // width及heigh給出窗口的寬高
  void auxInitPosition(GLint x,GLint y,GLsizei width, GLsizei heigh);

  2.2 定義繪圖窗口的標題

  // STR表示窗口標題字串
  void auxInitWindow(GLbyte* STR);

  2.3 定義繪圖窗口改變時的窗口刷新函數

  // 當窗口改變形狀時調指定的回調函數
  // NAME表示回調函數名稱
  void auxReshapeFunc(NAME);

  2.4 定義空閒狀態的空閒狀態函數以實現動畫

  // 當系統空閒時調用指定的回調函數
  // NAME表示回調函數名稱

  void auxIdleFunc(NAME);

  2.5 定義場景繪製函數(當窗口更新或場景改變時調用)

  // 當窗口需要更新或場景變化時調用
  // NAME表示回調函數名稱

  void auxMainLoop(NAME);

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