OpenGL教程之看起來很棒的霧

2021-04-02 12:50:19 字數 2480 閱讀 1039

jeff molofee(nehe)的opengl

教程

- 看起來很棒的霧

原 文

lesson 16: cool looking fog

譯 者

sakura

難道你不想把「霧」加入到你的opengl程式中嗎?那麼在這課裡我將要為您展現如何實現這項功能。這是我第一次寫教程,而且相對來說我也是opengl/c++程式設計新手,所以如果您發現有什麼錯誤的話,請讓我知道。這課的**是基於第7課的。

資料設定

我們將要設定我們用來儲存關於霧的資訊的所有變數。變數fogmode,用來儲存3種有關霧的型別:gl_exp,gl_exp2,gl_linear。稍後我會解釋這三種型別間的差別。這個變數將在**的開頭宣告。變數fogfilter,將被用做記錄您所選擇的霧的型別的索引。變數fogcolor會儲存任何您想要的霧的顏色。我們當然也要在**開始處加入乙個布林型別的變數gp使我們能夠知道鍵「g」是否被按下。

bool gp;

// 鍵g按下了嗎?(新增)

gluint filter;

// 使用哪種濾波方式?

gluint fogmode= ;

// 儲存霧的3種型別

gluint fogfilter= 0;

//glfloat fogcolor[4]= ;

// 霧的顏色

場景繪製設定

現在我們已經宣告完了我們的變數,接下來我們將要開始初始化opengl了。命令:glclearcolor()將會稍做改變以用來將螢幕顏色清除為霧的顏色以獲得更好的視覺效果。這裡並沒有複雜的**用來進行霧的操作,而且您會發現,這將是非常簡單的。

glclearcolor(

0.5f

,

0.5f

,

0.5f

,

1.0f

);

glfogi(gl_fog_mode, fogmode[fogfilter]);

// fog mode

glfogfv(gl_fog_color, fogcolor);

// set fog color

glfogf(gl_fog_density,

0.35f

);

// how dense will the fog be

glhint(gl_fog_hint, gl_dont_care);

// fog hint value

glfogf(gl_fog_start,

1.0f

);

// fog start depth

glfogf(gl_fog_end,

5.0f

);

// fog end depth

glenable(gl_fog);

// enables gl_fog

讓我們討論一下上面**的開始3行。

第一行glenable(gl_fog)解釋起來非常容易,它告訴opengl開始進行霧的計算。

第二行glfogi(gl_fog_mode,fogmode[fogfilter])確定了霧的型別。開始的時候我們宣告了陣列fogmode,它儲存了gl_exp,gl_exp2,gl_linear。在我們使用這些值之前,讓我稍做解釋:

第三行glfogfv(gl-fog_color,fogcolor)設定了霧的顏色,開始的時候我們把它設定為(0.5,0.5,0.5,1.0),使用變數fogcolor將給予我們漂亮的灰色。

接下來我們來看最後四行**:

glfogf(gl_fog_density,

0.35f

)確定了霧的密度,增大這個數值霧將會變的更濃,減小它霧將會變的更淡。

glhint(gl_fog_hint, gl_dont_care)確定了霧的渲染方式,我使用gl_dont_care是因為我並不關心建議值。然而這裡有乙個用來解釋關於這個項的不同值之間的區別:  

glfogf(gl_fog_start,

1.0f

)確定了霧的開始初離螢幕有多近。你可以將這個值改變為任意你想要的值,這個值描述了那個你想要使霧開始的位置。下一行與上行相似:glfogf(gl_fog_end, 5.0),它告訴opengl霧能離開螢幕有多遠。

按鍵事件

if (keys['g'] && !gp)

// g

鍵按下了嗎?

glfogi (gl_fog_mode, fogmode[fogfilter]);

// 霧的模式

}if (!keys['g'])

// g

鍵被釋放了嗎?

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

第16課 看起來很酷的霧 參照nehe 程式執行時效果如下 下面進入教程 我們這次將在第07課的基礎上修改 我只會講解有修改的部分,希望大家先找到第07課的 再跟著我一步步走。首先開啟myglwidget.h檔案,將類宣告更改如下 ifndef myglwidget h define myglwid...

C 實現螢幕錄影 網上看到的看起來不錯

using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.text using system.window...

《你只是看起來很努力》是這樣的嘛?

別問這個世界需要什麼,做你自己,這個世界需要的,就是你做你自己 騙別人很容易,騙自己更容易,可是,騙這個世界就有點難 優秀是不夠的,一定要卓越,一定要無可代替,才是最重要的 關於戀愛,找乙個能讓你進步的人很重要,找乙個能讓彼此進步的人更重要 跟著蜜蜂可以找到蜂蜜,跟著蒼蠅只能找到廁所 真正省錢的方式...