馬蕾 龔戈淬
摘 要:隨著計算機圖形學的發展,其在科學、工程、醫學、娛樂、廣告、圖形藝術等眾多領域得到了普遍應用。我們可以通過圖形應用程序來虛擬現實,以及GIS領域方面的遙感圖像信息系統的應用。為了逐步實現以上目標的應用,本文將以一個基于OPENGL的,使用高度圖(Heightmap)進行地形(Terraain)生成及在此基礎上的應用為實例,對系統的需求、算法、優化進行了詳細的介紹,并給出了可行的解決方法。
關鍵詞:計算機圖形學 HeightMap OPENGL Terrain
中圖分類號:G64 文獻標識碼:A 文章編號:1672-3791(2014)04(b)-0005-02
Abstract:With Computer Graphics is that figures study developments, its at science, numerous fieldses last general application at art, etc.s figures advertisements amusements medical sciences projects. We come virtual reality, and GIS the remote sensing picture the applications of information systems of field through figure application program. At application that realize the goal of the above progressively, this text at one a piece of one that is because of OPENGLs, The topography( Terraain) is produced and the application on the basis of this is the instance to use and highly pursue( Heightmap) to carry on , Demand, algorithm, optimize and introduce detailed one in system, besides, Have carried on brief analysis to some technological questions that are met in the course of developping, Give and publish feasible solution is from realizing angle explain figure the development and use the prospects of application program.
Key Words:Computer Graphics;HeightMap;OPENGL;Terrain
今天,對許多人而言,計算機和計算機圖形學已經成為日常生活不可分割的一部分。計算機圖形學在科學、工程、醫學、娛樂、廣告、圖形藝術、商業、教育和培訓等眾多領域得到了普遍的應用。開發高性能的圖形應用程序,就不可避免的使用到計算機圖形學知識。計算機圖形學是一門復雜而又多樣化的技術。要想了解這項技術,必須把它分成幾個易于操作的部分:如何在計算機中表示圖形、如何準備圖形的數據、如何顯示已準備好的圖形、如何實現人與圖形的交互。這里,圖形是一個廣義的概念,凡是可以在圖形設備上輸出的點、線和文本等的集合都可以稱為圖形。
盡管許多算法以多邊形或邊作為圖形的數據輸入,但多邊形或邊最終都可以用點來表示。因此,點才是圖形的基本組成元素。而曲線通常是通過段直線逼近來實現。至于材料紋理的表示子相當復雜,在許多情況下要使用曲線和點陣。本質上講,材料紋理還是用算法描述下的點、線的集合來表示的。
OPENGL實際上是一個開放的針對圖形硬件的三維圖形軟件包,它獨立如窗口系統和操作系統,以它為基礎開發的應用程序可以十分方便的在各種平臺間移植;從程序員的角度來看,OpenGL實際上是一些指令和函數的集合,現在已經能夠在多種平臺上使用。
OpenGL自1992年出現以來,逐漸成為工業上應用最廣泛的支持2D和3D圖形的應用程序編程接口,并且出現了成千上萬的基于各種計算機平臺的應用程序。OpenGL通過集成大量的渲染、紋理映射、特殊效果和其他強大的可視化函數,使得其應用程序更加新穎,并大幅度加速了圖形應用程序的開發。
1 OpenGL圖形操作步驟
在OpenGL中進行主要的圖形操作基本步驟如下:
首先根據基本圖形單元建立景物模型,并且對所建立的模型進行數學描述(OpenGL中把:點、線、多邊形、圖像和位圖都作為基本圖形單元)。然后把景物模型放在三維空間中的合適的位置,并且設置視點(viewpoint)以觀察所感興趣的景觀。接著,計算模型中所有物體的色彩,其中的色彩根據應用要求來確定,同時確定光照條件、紋理粘貼方式等。最后把景物模型的數學描述及其色彩信息轉換至計算機屏幕上的象素,這個過程也就是光柵化(rasterization)。
在這些步驟的執行過程中,OpenGL可能執行其他的一些操作,例如自動消隱處理等。另外,景物光柵化之后被送入幀緩沖器之前還可以根據需要對象素數據進行操作。
2 地形生成實現
在進行三維圖形編程的過程中,會遇到各種各樣的圖形格式,下面以TGA格式為例進行分析其處理過程:
首先需要處理TGA圖形文件頭信息,這其中包括從文件讀取12字節的頭、判斷該TGA文件是否是壓縮類型、最后通過fread(header, sizeof(header),1, file)函數將文件頭信息讀取header變量中。
接著通過獲取的頭文件信息來得到TGA文件的寬和高。
m_width=header[1]*256+header[0];
m_height=header[3]*256+header[2];
通過高和寬以及文件的位數(24位和32位)來判斷該TGA文件是否是正確的文件格式。
// Is the width less than or equal to zero?
// Is the height less than or equal to zero?
// Is the TGA 24 or 32 bits?
if (m_width<=0 || m_height<=0 || (header[4]!=24 && header[4]!=32))
為TGA文件分配內存空間
// Divide by 8 to get the bytes per pixel
BytesPerPixel = m_bpp / 8;
// Calculate the memory required for the TGA data
ImageSize = m_width * m_height * BytesPerPixel;
// Allocate memory to hold the TGA data
m_data = new GLubyte [ImageSize];
最后讀取不同TGA形式的數據內容存入到m_data變量中,關閉文件文件操作,對獲取的數據進行紋理渲染。
3 使用高度圖進行地形渲染
高度圖,即一個給定大小的位圖,已知點像素的顏色表明地形的高度。一般情況黑色可能是最低的高度,白色表明高度圖中最高的點。
第一步加載高度圖,將高度圖數據被存入變量heightmap,從而使用heigthmap中的數據計算高度地形。
第二步利用加載的高度圖,計算3D網格,即高度地形。
高度地形由一個頂點數組和一個索引數組組成,因此能夠用索引化的三角形渲染地形。頂點結構如下:
struct Vertex
{
float x,y,z;
DWORD color;
float u, v;
};
第三步把高度圖數據傳遞給負責用來生成3D地形CalculateHeightfield變量。通過為頂點分配空間并清空分配的內存。然后通過X和Z頂點進行計算紋理,獲得Y坐標,通過從高度圖得到當前像素值和比例因子的一半相乘來完成。
計算索引可以提高渲染期間性能,具體公式如圖1所示。
首先沿著X軸(列)然后沿著Z軸(行)。計算兩個連在一起生成一個方塊的三角形的索引,如圖1。第一個三角形是由cy,cv+1,cy+size構成,從而cv,triangle的值。當前的頂點(cy)是2因為z=0和x=2,然后(0*size+2)=2。因此第一個三角形看上去就像這:(cy,cv+1,cy+size)就是(2,2+1,128+2)或者(2,3,130)。
最后利用OpenGL的頂點數組來渲染我們的地形,渲染的代碼和效果圖如圖2所示。
void __fastcall Terrain::Render()
{
// Enable using Vertex Arrays
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// Set the Vertex Array to the start of our vertex data
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &Vertices[0].posx);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &Vertices[0].u);
// Render the Terrain
glDrawElements(GL_TRIANGLES, NumIndices, GL_UNSIGNED_SHORT, Indices);
// Disable Vertex Arrays
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
4 結語
基于OpenGL的計算機三維圖形應用程序的開發,是一項細致而又復雜的技術。本文首先對圖像進行建模,從而生成各種類型圖形文件,并以TGA格式為例進行渲染,然后使用高度圖進行地形渲染,生成漂亮的地形圖。
參考文獻
[1] 尚游,陳巖濤.OpenGL圖形程序設計指南[M].中國水利水電出版社,2001.
[2] OpenGL Architecture Review Board, 著,(美)Dave Shreiner,主編.OpenGL參考手冊[M].機械工業出版,2001.
[3] (美)David F. Rogers,著.計算機圖形學的算法基礎[M].石教英,彭群生,等,譯.機械工業出版,2002.
[4] (美)OpenGL體系評審委員會,Masson Woo,等,著.OpenGL編程權威指南[M].吳斌,等,譯.機械工業出版,2001.
[5] Stefan R¨ottger Wolfgang Heidrich, Philipp Slusallek, Hans-Peter Seidel《Real-Time Generation of Continuous Levels of Detail for Height Fields》
[6] (美)Richard,S.著OpenGL超級寶典[M].2版.瀟湘工作室,譯.人民郵電出版社, 2001.
[7] 吳海平.OpenGL圖形程序設計與 應用環境[M].國防科技大學出版社,1999.
[8] www.opengl.org OpenGL[EB/OL]. http://www.opengl.org/developers/about/overview.html.
[9] http://www.opengl.org/developers/documentation/glut.html SGI OpenGL Extension Registry - http://oss.sgi.com/projects/ogl-sample/registry/.
[10] www.flipCode.com,日常游戲開發信息及資源網站.
[11] mays.6to23.com,中國游戲開發者.