NeHe OpenGL第四十一課 體積霧氣

2021-09-05 03:17:50 字數 3715 閱讀 6637

nehe opengl第四十一課:體積霧氣

體積霧氣

把霧座標繫結到頂點,你可以在霧中漫遊,體驗一下吧。

這一課我們將介紹體積霧,為了執行這個程式,你的顯示卡必須支援擴充套件"gl_ext_fot_coord"。 

#include

#include

#include

#include

#include "nehegl.h"       

#pragma comment( lib, "opengl32.lib" )      

#pragma comment( lib, "glu32.lib" )     

gl_window* g_window;      

keys*  g_keys;        

下面的**設定霧的顏色和攝像機在z方向的深度 

glfloat fogcolor[4] = ;     // 霧的顏色

glfloat camz;         // 攝像機在z方向的深度

下面變數gl_fog_coordinate_source_ext和gl_fog_coordinate_ext具有初值,他們在glext.h檔案中被定義,這裡我們必須感謝lev povalahev,它建立了這個檔案。如果你想編譯你的**,你必須設定

這個值。

為了使用glfogcoordfext,我們需要定義這個函式的指標,並在程式執行時把它指向顯示卡中的函式。

// 使用fogcoordfext它需要的變數

#define gl_fog_coordinate_source_ext 0x8450     // 從glext.h得到的值

#define gl_fog_coordinate_ext  0x8451     

typedef void (apientry * pfnglfogcoordfextproc) (glfloat coord);  // 宣告霧座標函式的原形

pfnglfogcoordfextproc glfogcoordfext = null;     // 設定霧座標函式指標為null

gluint texture[1];       // 紋理

nehe的原文介紹了ipicture的介面,它不是我們這一課的重點,故我還是使用以前的方法載入紋理。 

下面的**用來檢測使用者的顯示卡是否支援ext_fog_coord擴充套件,這段**只有在你獲得opengl渲染描述表後才能呼叫,否則你將獲得乙個錯誤。

首先,我們建立乙個字串,來描述我們需要的擴充套件。接著我們分配一塊記憶體,用來儲存顯示卡支援的擴充套件,它可以通過glgetstring函式獲得。接著我們檢測是否含有需要的擴充套件,如果不存在,則返回false,如存在

我們把函式的指標指向這個擴充套件。 

int extension_init()

下面的**初始化opengl,並設定霧氣的引數。 

bool initialize (gl_window* window, keys* keys)     //初始化

下面的**繪製具體的場景 

void draw (void)

{glclear (gl_color_buffer_bit | gl_depth_buffer_bit);   

glloadidentity ();       

gltranslatef(0.0f, 0.0f, camz);      

下面的**繪製四邊形組成的牆,並設定每個頂點的紋理座標和霧座標 

glbegin(gl_quads);       //後牆

glfogcoordfext(0.0f); gltexcoord2f(0.0f, 0.0f); glvertex3f(-2.5f,-2.5f,-15.0f);

glfogcoordfext(0.0f); gltexcoord2f(1.0f, 0.0f); glvertex3f( 2.5f,-2.5f,-15.0f);

glfogcoordfext(0.0f); gltexcoord2f(1.0f, 1.0f); glvertex3f( 2.5f, 2.5f,-15.0f);

glfogcoordfext(0.0f); gltexcoord2f(0.0f, 1.0f); glvertex3f(-2.5f, 2.5f,-15.0f);

glend();

glbegin(gl_quads);       // 地面

glfogcoordfext(0.0f); gltexcoord2f(0.0f, 0.0f); glvertex3f(-2.5f,-2.5f,-15.0f);

glfogcoordfext(0.0f); gltexcoord2f(1.0f, 0.0f); glvertex3f( 2.5f,-2.5f,-15.0f);

glfogcoordfext(1.0f); gltexcoord2f(1.0f, 1.0f); glvertex3f( 2.5f,-2.5f, 15.0f);

glfogcoordfext(1.0f); gltexcoord2f(0.0f, 1.0f); glvertex3f(-2.5f,-2.5f, 15.0f);

glend();

glbegin(gl_quads);       // 天花板

glfogcoordfext(0.0f); gltexcoord2f(0.0f, 0.0f); glvertex3f(-2.5f, 2.5f,-15.0f);

glfogcoordfext(0.0f); gltexcoord2f(1.0f, 0.0f); glvertex3f( 2.5f, 2.5f,-15.0f);

glfogcoordfext(1.0f); gltexcoord2f(1.0f, 1.0f); glvertex3f( 2.5f, 2.5f, 15.0f);

glfogcoordfext(1.0f); gltexcoord2f(0.0f, 1.0f); glvertex3f(-2.5f, 2.5f, 15.0f);

glend();

glbegin(gl_quads);       // 右牆

glfogcoordfext(1.0f); gltexcoord2f(0.0f, 0.0f); glvertex3f( 2.5f,-2.5f, 15.0f);

glfogcoordfext(1.0f); gltexcoord2f(0.0f, 1.0f); glvertex3f( 2.5f, 2.5f, 15.0f);

glfogcoordfext(0.0f); gltexcoord2f(1.0f, 1.0f); glvertex3f( 2.5f, 2.5f,-15.0f);

glfogcoordfext(0.0f); gltexcoord2f(1.0f, 0.0f); glvertex3f( 2.5f,-2.5f,-15.0f);

glend();

glbegin(gl_quads);       // 左牆

glfogcoordfext(1.0f); gltexcoord2f(0.0f, 0.0f); glvertex3f(-2.5f,-2.5f, 15.0f);

glfogcoordfext(1.0f); gltexcoord2f(0.0f, 1.0f); glvertex3f(-2.5f, 2.5f, 15.0f);

glfogcoordfext(0.0f); gltexcoord2f(1.0f, 1.0f); glvertex3f(-2.5f, 2.5f,-15.0f);

glfogcoordfext(0.0f); gltexcoord2f(1.0f, 0.0f); glvertex3f(-2.5f,-2.5f,-15.0f);

glend();

學習python 第四十一天

python 對檔案的處理 python open 函式用於開啟乙個檔案,建立乙個 file 物件,相關的方法才可以呼叫它進行讀寫。response的常用方法 response.text str 文字資料 可以根據http頭部對響應的編碼來進行解碼 response.content bytes型的二...

LeetCode第四十一題 Python實現

title leetcode no.41 categories tags 給你乙個未排序的整數陣列 nums 請你找出其中沒有出現的最小的正整數。高階 你可以實現時間複雜度為 o n 並且只使用常數級別額外空間的解決方案嗎?示例 1 輸入 nums 1,2,0 輸出 3 示例 2 輸入 nums 3...

韓順平網頁設計第四十一講

為什麼要dom程式設計 js最重要的功能就是讓使用者與網頁元素進行互動操作。這才是學js的精華所在。使用者可以對頁面元素進行各種操作。document就是乙個dom物件,它表示的是這個html文件,我們可以通過這個文件來訪問文件中的元素。dom程式設計是ajax的基礎。dom程式設計關係的示意圖 d...