第16課:看起來很酷的霧(參照nehe)
程式執行時效果如下:
下面進入教程:
我們這次將在第07課的基礎上修改**,我只會講解有修改的部分,希望大家先找到第07課的**再跟著我一步步走。首先開啟myglwidget.h檔案,將類宣告更改如下:
#ifndef myglwidget_h
#define myglwidget_h
#include #include class myglwidget : public qglwidget
;#endif // myglwidget_h
我們只是增加了乙個變數m_fog來儲存當前霧的模式(我們會使用三種霧模式),方便我們後面利用鍵盤來控制霧模式的切換。
接下來,我們需要開啟myglwidget.cpp,在建構函式中初始化新增變數,具體**如下:
myglwidget::myglwidget(qwidget *parent) :
qglwidget(parent)
我們給m_fog賦初始值0,表示第一種霧模式(具體是哪一種下面會講到)。
然後我們需要來修改initializegl()函式,霧效果的資料初始化都這裡完成的,具體**如下:
void myglwidget::initializegl() //此處開始對opengl進行所以設定
; //環境光引數
glfloat lightdiffuse = ; //漫散光引數
glfloat lightposition = ; //光源位置
gllightfv(gl_light1, gl_ambient, lightambient); //設定環境光
gllightfv(gl_light1, gl_diffuse, lightdiffuse); //設定漫射光
gllightfv(gl_light1, gl_position, lightposition); //設定光源位置
glenable(gl_light1); //啟動一號光源
//霧部分
glfloat fogcolor = ; //霧的顏色
glfogi(gl_fog_mode, gl_exp); //設定霧氣的初始模式
glfogfv(gl_fog_color, fogcolor); //設定霧的顏色
glfogf(gl_fog_density, 0.35); //設定霧的密度
glhint(gl_fog_hint, gl_dont_care); //設定系統如何計算霧氣
glfogf(gl_fog_start, 1.0f); //霧的開始位置
glfogf(gl_fog_end, 5.0f); //霧的結束位置
glenable(gl_fog); //啟動霧效果
}
首先我們改一下glclearcolor()函式的引數,讓清除螢幕的顏色與下面霧的顏色相同。我們在函式末尾加上了我們的霧效果**,首先我們定義霧的顏色(我們定為白色霧,你完全可以根據自己的喜好修改),接著我們設定了霧氣的初始模式為gl_exp,這是m_fog等於0時對應的模式,先別急著問為什麼,下面會告訴你答案。
然後我們設定霧的密度,glfogf()函式的第二個引數越大霧會越濃,越小霧會越稀。glhint()函式用於設定修正,我們使用了gl_dont_care因為我們不關心它的值。再接下去兩行設定了霧的起始位置和結束位置,1.0f和5.0f均表示離螢幕的距離,我們完全可以自己根據需要修改這兩個值。最後我們應用glenable()啟用了霧效果,注意沒有這行是無法產生無效果的。
最後是關於鍵盤控制函式的修改,我們將利用它來控制霧模式的切換,具體**如下:
void myglwidget::keypressevent(qkeyevent *event)
; switch (event->key())
else
break;
case qt::key_escape: //esc為退出鍵
close();
break;
case qt::key_l: //l為開啟關閉光源的切換鍵
m_light = !m_light;
if (m_light)
else
break;
case qt::key_g: //g為霧模式的切換鍵
m_fog++;
if (m_fog == 3)
glfogi(gl_fog_mode, fogmode[m_fog]);
break;
case qt::key_pageup: //pageup按下使木箱移向螢幕內部
m_deep -= 0.1f;
break;
case qt::key_pagedown: //pagedown按下使木箱移向觀察者
m_deep += 0.1f;
break;
case qt::key_up: //up按下減少m_xspeed
m_xspeed -= 0.1f;
break;
case qt::key_down: //down按下增加m_xspeed
m_xspeed += 0.1f;
break;
case qt::key_right: //right按下減少m_yspeed
m_yspeed -= 0.1f;
break;
case qt::key_left: //left按下增加m_yspeed
m_yspeed += 0.1f;
break;}}
注意到我們定義了乙個靜態gluint陣列fogmode來儲存我們要切換的霧模式gl_exp、gl_exp2、gl_linear三種模式。gl_exp - 充滿整個螢幕的只是基本渲染的霧,並不是特別像霧;gl_exp2 - 比gl_exp更進一步,它也是充滿整個螢幕,但它使螢幕看起來更有深度;gl_linear - 最好的渲染模式,物體淡入淡出的效果更自然(我們可以通過切換鍵比較看看效果就知道了)。由於gl_exp放在fogmode[0]處,故m_fog為0時對應的模式是gl_exp。
每次按下g鍵,我們就讓m_fog加一,如果加後等於3,就讓它重新回到0,然後呼叫glfogi()函式重新選擇霧模式。
現在就可以執行程式檢視效果了!
libQGLViewer看起來不錯
今天在windows下用原始碼編譯了qglviewer,試了幾個例子,看起來還不錯。先試用一段時間,如果成熟的話,作為mesh deformer的基礎也不錯。使用qmake可以將.pro轉換成vs的工程檔案或mac下的xcode工程。在windows下我用的是 win32 msvc2005 win3...
OpenGL教程之看起來很棒的霧
jeff molofee nehe 的opengl 教程 看起來很棒的霧 原 文 lesson 16 cool looking fog 譯 者 sakura 難道你不想把 霧 加入到你的opengl程式中嗎?那麼在這課裡我將要為您展現如何實現這項功能。這是我第一次寫教程,而且相對來說我也是openg...
讓Linux看起來cool
你可能看多好萊塢的電影 黑客帝國 並陶醉於被賦予neo的能看到在矩陣中任何事物的能力,或者你會想到一幅類似於 hacker 的桌面的生動畫面。安裝 cmatrix apt get install cmatrix yum install cmatrix試試你未知的運氣,終端裡有時也有好玩的。安裝 fo...