NeHe OpenGL第四十四課 3D光暈

2021-09-22 04:39:47 字數 2664 閱讀 5839

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教程 第四十四課 3D光暈

翻譯 nehe opengl 教程 前言宣告,此 nehe opengl教程系列文章由51部落格yarin 翻譯 2010 08 19 本部落格為 並稍加整理與修改。對nehe的opengl管線教程的編寫,以及yarn的翻譯整理表示感謝。nehe opengl第四十四課 3d光暈 3d 光暈 glv...

實習篇 第四十四天

昨天系統公升級,我擔心的一夜沒有睡好覺,準確的說是這一周都沒有睡個好覺,整天是提心吊膽的,順理成章的我也感冒了!有句話說的好 只有在你生病的時候最想家!但是這一次,這種感覺竟被工作上的事給壓了下去!上午來到公司就聽見經理打 說系統更改過密碼之後提示有錯誤,我隱隱約約感到有問題。果然不出所料,下午問題...

程式設計訓練第四十四期 多數元素

給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數 大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。1.雜湊表 時間複雜度o n 我們遍歷陣列 nums 一次,對於 nums 中的每乙個元素,將其插入雜湊表都只需要常數時間。如果在遍歷時沒有維護最...