OPENGL入門函數
來源:互聯網
上載者:User
glLoadIdentity()// 重設當前的模型觀察矩陣調用,glLoadIdentity()之後,您實際上將當前點移到了螢幕中心。
glTranslatef(x, y, z) //沿著 X, Y 和 Z 軸移動。glTranslatef(-1.5f,0.0f,-6.0f);//沿著X軸左移1.5個單位,Y軸不動(0.0f),最後移入螢幕6.0f個單位當您用函數移動的時候,您並不是相對螢幕中心移動,而是相對與當前所在的螢幕位置。
畫多邊形過程:
glBegin(GL_TRIANGLES) 的意思是開始繪製三角形……它們之間的點都是以三點為一個集合的,這同樣適用於四邊形
GL_QUADS。glVertex 的第一個參數是X座標,然後依次是Y座標和Z座標。第一個點是上頂點,然後是左下頂點和右下頂點。
glEnd() 告訴OpenGL三角形已經建立好了。
色彩值:色彩值的範圍從0.0f到1.0f。0.0f代表最黑的情況,1.0f就是最亮的情況。glClearColor 後的第一個參數是Red Intensity(紅色分量),第二個是綠色,第三個是藍色。glColor3f(r,g,b)。括弧中的三個參數依次是紅、綠、藍三色分量。
旋轉角度:GLfloat rtri; // 定義用於三角形的角度GLfloat rquad; // 定義用於四邊形的角度glRotatef(Angle,Xvector,Yvector,Zvector) //負責讓對象繞某個軸旋轉。rtri+=0.2f; // 增加三角形的旋轉變數(速度)—置於參數Angle中rquad-=0.15f; // 減少四邊形的旋轉變數
載入映像:映像的寬和高必須是2的n次方;寬度和高度最小必須是64象素;並且出於相容性的原因,映像的寬度和高度不應超過256象素。如果您的原始素材的寬度和高度不是64,128,256象素的話,使用影像處理軟體重新改變映像的大小。可以肯定有辦法能繞過這些限制,但現在我們只需要用標準的紋理尺寸。AUX_RGBImageRec *LoadBMP(char *Filename)
//
載入位元影像圖象{ FILE *File=NULL; // 檔案控制代碼if (!Filename) // 確保檔案名稱已提供 {return NULL;} // 如果沒提供,返回 NULLFile=fopen(Filename,"r"); // 嘗試開啟檔案if (File) // 檔案存在麼? { fclose(File); // 關閉控制代碼 return auxDIBImageLoad(Filename); // 載入位元影像並返回指標 }return NULL; // 如果載入失敗,返回 NULL} int LoadGLTextures()
//
載入位元影像(
調用上面的代碼)
並轉換成紋理{int Status=FALSE; // 狀態指示器AUX_RGBImageRec *TextureImage[1]; // 建立紋理的儲存空間memset(TextureImage,0,sizeof(void *)*1); // 將指標設為 NULL// 載入位元影像,檢查有無錯誤,如果位元影像沒找到則退出if (TextureImage[0]=LoadBMP("Data/NeHe.bmp")){ Status=TRUE; // 將 Status 設為 TRUE glGenTextures(1, &texture[0]); // 建立一個紋理 // 使用來自位元影像資料產生 的典型紋理 glBindTexture(GL_TEXTURE_2D, texture[0]); // 產生紋理glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);//上面一行告訴OpenGL此紋理是一個2D紋理 ( GL_TEXTURE_2D )。參數“0”代表映像的詳細程度,通常就由它為零去了。參數三是資料的成分數。因為映像是由紅色資料,綠色資料,藍色資料三種組分組成。 TextureImage[0]->sizeX 是紋理的寬度。如果您知道寬度,您可以在這裡填入,但電腦可以很容易的為您指出此值。 TextureImage[0]->sizey 是紋理的高度。參數零是邊框的值,一般就是“0”。 GL_RGB 告訴OpenGL映像資料由紅、綠、藍三色資料群組成。GL_UNSIGNED_BYTE 意味著組成映像的資料是無符號位元組類型的。最後... TextureImage[0]->data 告訴OpenGL紋理資料的來源。此例中指向存放在 TextureImage[0] 記錄中的資料。glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); } if (TextureImage[0]) // 紋理是否存在 { if (TextureImage[0]->data) // 紋理映像是否存在 { free(TextureImage[0]->data); // 釋放紋理映像佔用的記憶體 } free(TextureImage[0]); // 釋放映像結構 }return Status; // 返回 Status}
繪製貼圖(紋理映射)過的立方體:glTexCoord2f 的第一個參數是X座標。 0.0f 是紋理的左側。1.0f 是紋理的右側。 glTexCoord2f 的第二個參數是Y座標。 0.0f 是紋理的底部。 1.0f 是紋理的頂部。
一般表達方式:glBegin(GL_QUADS);// 前面glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 紋理和四邊形的左下glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 紋理和四邊形的右下glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 紋理和四邊形的右上glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 紋理和四邊形的左上……glEnd();
光照:GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; // 環境光線參數我們得到的是半亮(0.5f)的白色環境光線。如果沒有環境光線,未被漫射光照到的地方會變得十分黑暗。GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; // 漫射光參數GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f }; // 光源位置int InitGL(GLvoid)中設定:glLightfv(GL_LIGHT1, GL_AMBIENT,
LightAmbient); // 設定環境光線glLightfv(GL_LIGHT1, GL_DIFFUSE,
LightDiffuse); // 設定漫射光glLightfv(GL_LIGHT1, GL_POSITION,
LightPosition); // 設定光源位置glEnable(GL_LIGHT1); // 啟用一號光源
鍵盤控制:if (keys['L'] && !lp) // L 鍵已按下並且鬆開了?{lp=TRUE; // lp 設為 TRUElight=!light; // 切換光源的 TRUE/FALSEif (!light) // 如果沒有光源 { glDisable(GL_LIGHTING); // 禁用光源 } else // 否則 { glEnable(GL_LIGHTING); // 啟用光源 }}if (!keys['L']) // L鍵鬆開了麼?{ lp=FALSE; // 若是,則將lp設為FALSE}if (keys[VK_PRIOR]) // PageUp按下了?{ z-=0.02f; // 若按下,將木箱移向螢幕內部}if (keys[VK_PRIOR]) // PageUp按下了?{ z-=0.02f; // 若按下,將木箱移向螢幕內部}
混合(Blend
):絕大多數人都認為Alpha分量代表材料的透明度。這就是說,alpha值為0.0時所代表的材料是完全透明的。alpha值為1.0時所代表的材料則是完全不透明的。glColor4f(1.0f,1.0f,1.0f,0.5f); // 全亮度, 50% Alpha 混合(GL_RGBA)glBlendFunc(GL_SRC_ALPHA,GL_ONE); // 基於源象素alpha通道值的半透明混合函數