歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

OpenGL 3D迷宮場景設計

最近學習用OpenGL3D庫來構建一個3D場景,以及實現場景漫游、粒子系統等效果,最終算是是做了一個3D走迷宮游戲吧。感覺最近學了好多東西,所以有必要整理整理。

一 實現效果

OpenGL 渲染篇 http://www.linuxidc.com/Linux/2011-10/45756.htm

Ubuntu 13.04 安裝 OpenGL http://www.linuxidc.com/Linux/2013-05/84815.htm

OpenGL三維球體數據生成與繪制【附源碼】 http://www.linuxidc.com/Linux/2013-04/83235.htm

Ubuntu下OpenGL編程基礎解析 http://www.linuxidc.com/Linux/2013-03/81675.htm

如何在Ubuntu使用eclipse for c++配置OpenGL http://www.linuxidc.com/Linux/2012-11/74191.htm

《OpenGL超級寶典》學習筆記 http://www.linuxidc.com/Linux/2013-10/91414.htm

二 實現過程詳解

1、3d場景構建

1)光照與材質

通過設置光照與材質,使得場景的顯示效果更真實。opengl加光源的方法:

GLfloat light_position[] = {0.0, 80.0, 0.0};
 GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
 glLightfv(GL_LIGHT0, GL_POSITION, light_position);
 glLightfv(GL_LIGHT0, GL_AMBIENT_AND_DIFFUSE, light_diffuse);
 glEnable(GL_LIGHTING);
 glEnable(GL_LIGHT0);

加一個光源至少要上面這些代碼,通過glLightfv()函數給光源設置位置以及顏色,可以加環境光G_AMBIENT、漫射光GL_DIFFUSE或鏡面光GLSPECULAR,可以同時加8個光源,上面的光源時GL_LIGHT0,其他的就是GL_LIGHT1、2等。
 
場景中一旦加了光源,物體就會根據自己的材質對RGB光成分反射程度而顯示不同的顏色。OpenGL給一個物體設置材質的方法

GLfloat diffuse[] = {1.0, 0.9, 0.9};
 glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, diffuse);

設置材質參數後接下來畫的物體就具備了這種材質。通常使用參數GL_AMBIENT_AND_DIFFUSE給環境光和漫射光設置相同的反射程度。

2)紋理映射與多重紋理映射
 
給模型加紋理是為了在表面形成復雜圖案,因為設置材質只是控制表面的顯示顏色,實際上物體的表面信息要更復雜些。opengl提供了給物體貼紋理圖的方法,實際上有多種方法,但我用的是 glaux庫。

struct IMAGE
{
 GLuint sizeX;
 GLuint sizeY;
 signed char* data;
};
IMAGE *Image[3];
GLuint Texture[3];
bool loadTexture()//設置各種紋理,從bmp圖像讀取
{
 FILE* myFile;
 if(!(myFile = fopen("wall.bmp", "r")))
 return false;
 Image[0] = (IMAGE*)auxDIBImageLoad("wall.bmp");
 glGenTextures(3, &Texture[0]);
 glBindTexture(GL_TEXTURE_2D, Texture[0]);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 glTexImage2D(GL_TEXTURE_2D, 0, 3, Image[0]->sizeX, Image[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Image[0]->data);
 if(!(myFile = fopen("floor.bmp", "r")))
  return false;
 Image[1] = (IMAGE*)auxDIBImageLoad("floor.bmp");
 glBindTexture(GL_TEXTURE_2D, Texture[1]);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 glTexImage2D(GL_TEXTURE_2D, 0, 3, Image[1]->sizeX, Image[1]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Image[1]->data);
 if(!(myFile = fopen("water.bmp", "r")))
  return false;
 Image[2] = (IMAGE*)auxDIBImageLoad("water.bmp");
 glBindTexture(GL_TEXTURE_2D, Texture[2]);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 glTexImage2D(GL_TEXTURE_2D, 0, 3, Image[2]->sizeX, Image[2]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Image[2]->data);
 
 //釋放內存
 if(Image[0])
 {
  if(Image[0]->data)
   free(Image[0]->data);
   free(Image[0]);
 }
 if(Image[1])
 {
  if(Image[1]->data)
   free(Image[1]->data);
  free(Image[1]);
 }
 if(Image[2])
 {
  if(Image[2]->data)
   free(Image[2]->data);
  free(Image[2]);
 }
 return true;
}

上面的代碼生成了三種紋理。語句glGenTextures(3, &Texture[0])生成了三個紋理索引,存在了數組Texture中,以後每次要設置紋理信息或是想應用紋理,通過函數glBindTexture(GL_TEXTURE_2D, textureIndex)就可以取到對應的紋理,其中第二個參數就是紋理索引。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-06/103009p2.htm

Copyright © Linux教程網 All Rights Reserved