NeHe OpenGL教程 第四十四課 3D光暈

2022-03-23 14:48:39 字數 2958 閱讀 3134

**【翻譯】nehe opengl 教程

前言宣告,此 nehe opengl教程系列文章由51部落格yarin

翻譯(2010-08-19),本部落格為**並稍加整理與修改。對nehe的opengl管線教程的編寫,以及yarn的翻譯整理表示感謝。

nehe opengl第四十四課:3d光暈

3d 光暈

glvector v;                   

// 根據當前的偏轉角旋轉視線

glrotatef(m_headingdegrees, 0.0f, 1.0f, 0.0f);

glrotatef(m_pitchdegrees, 1.0f, 0.0f, 0.0f);

// 返回模型變換矩陣

glgetfloatv(gl_modelview_matrix, matrix);

// 獲得視線的方向

m_directionvector.i = matrix[8];

m_directionvector.j = matrix[9];

m_directionvector.k = -matrix[10];

// 重置矩陣

glloadidentity();

// 旋轉場景

glrotatef(m_pitchdegrees, 1.0f, 0.0f, 0.0f);

glrotatef(m_headingdegrees, 0.0f, 1.0f, 0.0f);

// 設定當前攝像機的位置

v = m_directionvector;

v *= m_forwardvelocity;

m_position.x += v.i;

m_position.y += v.j;

m_position.z += v.k;

// 變換到新的位置

gltranslatef(-m_position.x, -m_position.y, -m_position.z);

}好了,我們現在開始吧。我將使用4個對立的紋理來製造我們的鏡頭光暈,第一和二個光暈影象被放置在光源處,第三和第四個影象將根據視點的位置和方向動態的生成。紋理的影象如下所示:

現在你在頭腦裡應該有了乙個大慨地影象了吧。我們來說說何時我們應該繪製光暈,一般來說*時我們是看不見這些光暈的,只有當我們對準光源的時候才能看見這些。所以我們首先要獲得視景體的資料,下面的函式可

以幫我們完成這個功能。

// 獲得當前視景體的6個*面方程的引數void glcamera::updatefrustum()

現在我們可以測試乙個點或圓是否在視景體內了。下面的函式可以測試乙個點是否在視景體內。 

bool glcamera::pointinfrustum(glpoint p) } return(true);}

下面的函式用來測試某個點是否位於當前場景物體的前面:

bool glcamera::isoccluded(glpoint p)

我們通過檢測光源是否正對我們的視線來決定是否繪製光暈,但如果你的視點超過了光源的位置,則會發生看不見光暈的現象。為了避免這種現象,我們在移動視點的使用,也相應的移動我們的光源。為了在視點和光

源之間繪製多個光暈,我們需要計算之間的向量,下面的**完成這個功能: 

//下面的函式完成具體的渲染光暈的任務void glcamera::renderlensflare()

gldisable(gl_blend );

glenable(gl_depth_test);

gldisable(gl_texture_2d); }}

好了,下面的函式用來繪製四種不同的光暈 

//繪製halo形的光暈void glcamera::renderhalo(glfloat r, glfloat g, glfloat b,

glfloat a, glpoint p, glfloat scale)

//繪製gloew形的光暈

void glcamera::renderglow(glfloat r, glfloat g, glfloat b, glfloat a, glpoint p, glfloat scale)

//繪製bigglow形的光暈

void glcamera::renderbigglow(glfloat r, glfloat g, glfloat b, glfloat a, glpoint p, glfloat scale)

//繪製streaks形的光暈

void glcamera::renderstreaks(glfloat r, glfloat g, glfloat b, glfloat a, glpoint p, glfloat scale)

{glpoint q[4];

q[0].x = (p.x - scale);

q[0].y = (p.y - scale);

q[1].x = (p.x - scale);

q[1].y = (p.y + scale);

q[2].x = (p.x + scale);

q[2].y = (p.y - scale);

q[3].x = (p.x + scale);

q[3].y = (p.y + scale);

glpushmatrix();

gltranslatef(p.x, p.y, p.z);

glrotatef(-m_headingdegrees, 0.0f, 1.0f, 0.0f);

glrotatef(-m_pitchdegrees, 1.0f, 0.0f, 0.0f);

glbindtexture(gl_texture_2d, m_streaktexture);

glcolor4f(r, g, b, a);

NeHe OpenGL第四十課 繩子的模擬

nehe opengl第四十課 繩子的模擬 繩子的模擬 怎樣模擬一根繩子呢,把它想象成乙個個緊密排列的點,怎麼樣有了思路了吧,在這一課你你將學會怎樣建模,簡單吧,你能模擬更多。繩索模擬 在這個教程裡我們將模擬一段繩索,我們是在39課的基礎上進行的。在物理模擬中,我們必須設定各個物理量,就像它們在自然...

NeHe OpenGL第四十一課 體積霧氣

nehe opengl第四十一課 體積霧氣 體積霧氣 把霧座標繫結到頂點,你可以在霧中漫遊,體驗一下吧。這一課我們將介紹體積霧,為了執行這個程式,你的顯示卡必須支援擴充套件 gl ext fot coord include include include include include nehegl...

NeHe OpenGL第四十五課 頂點快取

nehe opengl第四十五課 頂點快取 頂點快取 你想更快地繪製麼?直接操作顯示卡吧,這可是當前的圖形技術,不要猶豫,我帶你入門。接下來,你自己向前走吧。速度是3d程式中最重要的指標,你必須限制繪製的多邊形的個數,或者提高顯示卡繪製多邊形的效率。顯示卡最近增加了乙個新的擴充套件,叫做頂點快取vs...