真實感場景繪製(附原始碼)

2022-03-24 01:41:50 字數 3570 閱讀 5266

首先給出繪製效果圖:

說明:

本系統繪製了乙個真實感的三維場景,並實現場景漫遊。使用按鍵↑、↓、←、→或w、s、a、d控制運動方向,pgdn和pgup可以改變觀察者的高度,滑鼠控制轉向,按鍵『f』可以開啟和關閉「霧氣」,esc退出程式。

本場景中繪製了牆壁與地面、天空、石柱、箱子、玻璃球、雪人、霧等物件,下面將依次分析它們的設計思路,這裡將使用相同繪製技術的物件放到一起說明。

1、 牆壁、地面、箱子

它們的基本操作對四邊形的紋理對映,將一幅紋理圖的四個頂點座標分別對映到四邊形的四個頂點上即可。opengl就自動通過插值填充多邊形內部的紋理。由於在opengl中紋理座標是乙個點的屬性,故需要在繪製點之前指定該點的紋理座標。另外在繪製四邊形時要保證繪製順序的一致,這裡統一採用逆時針順序繪製。紋理座標範圍在[0,1]之間,座標超過1則採用重複的方式(opengl預設處理方式)。這樣可以在對映時按四邊形的比例設定紋理座標,從而防止紋理圖過度拉伸造成的變形。乙個四邊形的紋理對映步驟為:

glbindtexture(gl_texture_2d,texture[0]); 

glbegin(gl_quads); 

gltexcoord2f(0.0f, 0.0f); glvertex3f(30.0f,0.0f, -170.0f);

gltexcoord2f(1.0f, 0.0f); glvertex3f(30.0f,0.0f, -150.0f);

gltexcoord2f(1.0f, 1.0f); glvertex3f(30.0f,20.0f,-150.0f);

gltexcoord2f(0.0f, 1.0f); glvertex3f(30.0f,20.0f,-170.0f);

glend();

實驗效果如下:

圖1.牆壁、地面、箱子

2、 石柱、雪人

石柱和雪人都屬於二次幾何體的繪製和紋理對映,其中雪人由圓柱、球體、圓盤、圓錐構成。opengl提供了這些基本幾何體的繪製函式,而且在紋理對映時我們採用自動生成紋理座標的方法,所以這一部分工作量其實很少。另外,為了給雪人的身體、鼻子等部位設定顏色時,我們需要關閉紋理對映、並更改材質的屬性(物體的顏色是由光源和材質共同作用的結果)。對於石柱,我們加上了繞自身區域性座標y軸的勻速旋轉。實驗效果如下:  

圖2.雪人                                                圖3.石柱

我們使用glut庫提供的如下函式繪製二次幾何體:

glucylinder:繪製圓柱和圓柱

glusphere:繪製球體

gludisk:繪製圓盤

使用gluquadrictexture設定自動計算紋理座標。

3、 玻璃球

在繪製玻璃球時,為了在球面上反射出周圍的場景,我們使用了環境對映。由於我們能夠在三維場景中漫遊,這就需要球面上反射出的場景是隨著視點移動而變化的,這一需求可以利用「渲染到紋理」(rtt)技術實現。其基本思想是:首先繪製出環境中的所有物體(除了該玻璃球),接著將繪製得到的場景圖製作成紋理,在繪製該玻璃球時將此紋理圖貼在球面上即可。

我們使用的核心函式是glcopyteximage2d,該函式可以將幀快取中的顏色值複製到紋理快取中。實驗發現該函式效能較低,會拖慢整個程式的速度,為了平衡繪製質量和速度,可以只拷貝一部分畫素值。實驗效果如下:

圖4.玻璃球

4、 霧氣

opengl中提供了完整的霧化介面,我們只需要選擇合適的霧氣的混合因子、密度、顏色、起始位置等。我們的霧氣設定如下:

glfloat fogcolor[4]=;    

glfogi(gl_fog_mode,gl_exp2);//模式

glfogfv(gl_fog_color,fogcolor);//顏色

glfogf(gl_fog_density, 0.004f);//密度

glfogf(gl_fog_start, 5.0f);//開始距離

glfogf(gl_fog_end, 300.0f);//結束距離

glhint(gl_fog_hint,gl_nicest);//霧化效果

實驗效果如下:

圖5.霧氣

5、 天空

天空包含雲、星星、閃電三個物件。我們要實現的目標是:雲在空中飄動、且能夠遮蓋住空中的星星,每間隔一段時間都會有閃電和雷聲。

天空的繪製主要使用了顏色混合技術。首先將星星的紋理圖對映到天空,為了實現雲朵覆蓋住星星,我們使用了如下技巧:製作乙個關於雲圖(圖6)的二值影象(圖7),其中有云的部分為黑色、無雲的部分為白色。將該二值影象作為「掩模」與星星圖進行混合,並設定混合因子glblendfunc (gl_dst_color,gl_zero),該設定可以將星星圖中對應「掩模」黑色的部分置為黑色、對應「掩模」白色的部分保留原色。接著再將雲圖對映至天空,並更改混合因子glblendfunc(gl_one, gl_one),該設定實現源色與目的色相加。至此已經實現雲對星星的遮蓋,另外,在進行顏色混合時需要開啟opengl的顏色混合功能,且要關閉深度測試功能。

圖6.雲圖                         圖7.二值圖

為了實現雲的飄動,我們在設定雲圖紋理座標時新增乙個變數,該變數從0遞增至1,超過1時做減1操作,這樣就可以模擬雲的移動。如下的roll即為該變數:

圖8.天空

非真實感渲染

非真實感渲染的定義 就是使用一些渲染方法使得畫面達到某些特殊的繪畫風格相似的效果,簡稱npr。渲染輪廓線的方式 常見渲染方式如下 1.基於觀察角度和表面法線的輪廓線渲染 這種方法就是使用視角方向和法線方向的點乘結果來得到輪廓資訊。但是很多模型渲染出來的描邊效果卻不盡人意,而且也不能控制輪廓線風格的渲...

learnopencv非真實感渲染

邊緣保留過濾器 edgepreservingfilter 輸出3通道影象 recurs filter 遞迴過濾 1,normconv filter 歸一化卷積 2。使用recurs filter選項的速度比normconv filter快3.5倍。當不需要銳化並且速度很重要時,應使用recurs f...

1 2 真實感繪製與光線跟蹤演算法概覽

真實感繪製的目的是建立乙個與真實的場景不可區分的三維場景的影象,在我們描述渲染過程之前,重要的是要理解 不可區分 這個詞是不準確的,因為它涉及到觀察者,不同的觀察者對於同乙個影象的感知也會不相同。雖然我們將在書中介紹一些感性問題,但要精確的表現觀測者的感性認知是乙個非常困難且很難解決的問題。在大多數...