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