Qt OpenGL教程 16 看起來很酷的霧

2021-07-04 08:46:13 字數 3779 閱讀 2986

第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...