跳轉到內容

影片遊戲設計/程式設計/真實模擬

來自 Wikibooks,開放世界中的開放書籍

真實感(現實模擬)

[編輯 | 編輯原始碼]

光線和陰影

[編輯 | 編輯原始碼]

燈光和紋理

[編輯 | 編輯原始碼]

光照貼圖

[編輯 | 編輯原始碼]

凹凸貼圖

[編輯 | 編輯原始碼]

法線貼圖

[編輯 | 編輯原始碼]

視差對映

[編輯 | 編輯原始碼]
新增細節

讓遊戲包含一些微小的,即使重複的細節,也能提供更豐富的體驗,無論是陣陣風聲,一粒塵埃,垃圾桶上方的蒼蠅,一片隨風飄落的樹葉,都可能像動態燈光一樣,擁有強大的效果。

水可能是遊戲中最難再現的效果,它包含反射、透明度和扭曲,像波浪、泡沫一樣的高細節,並且是流體,表現得像固體和液體一樣,因此,取決於你想要達到的細節水平,這不僅是一項艱鉅的任務,而且如果即時完成,還會消耗大量的計算能力。

對於引擎的這一部分,我們將使用 OpenAL API。為什麼?因為在選擇 API 時提到了以下簡單的理由:它開源、跨平臺、功能強大,同時使用起來也相對容易。所以讓我們開始吧...

遊戲世界中所有可以發出聲音的物體都有一個位置(背景音樂除外)。此外,聲音還與某種觸發事件相關聯,因此當玩家做某些事情啟用觸發器時,聲音就會開始播放。很簡單吧!那麼我們實際上如何實現這一點呢?

OpenAL 的工作原理是,有一個 source(播放的聲音)和一個 listener(正在聆聽的人),這兩個物件可以放置在 3D 環境中的任何位置,並賦予某些屬性,例如使用什麼衰減模型,聲音源的移動速度等,但這些我們稍後再講。你還可以擁有許多聲音源(這很合理),但只能擁有一個聆聽者(這也十分合理)。當你新增 OpenAL 要播放的聲音時,你需要先執行三件事:建立一個緩衝區,用於將音訊資料載入到其中,然後建立一個聲音源,然後將聲音源與緩衝區關聯起來,以便 OpenAL 知道從哪個聲音源播放什麼音訊。因此,考慮到所有這些因素,我們將把每個聲音源封裝到一個 C++ 結構體中。該結構體(我們稱之為 newSource)將包含聲音源的位置資訊,作為 sourcePos[3],一個 sourceID 和一個 bufferID,以便我們可以唯一地定址每個聲音源。

我們還需要考慮的是,由於 OpenAL 很友好地根據距離為我們衰減聲音,因此我們需要讓聲音在玩家到達聲音源的“外邊界”(你再也聽不到聲音播放的點)時開始播放。因此,我們將在結構體中新增一個 activateDistance 值。

此外,我們還需要考慮,由於聲音資料無法從硬碟上立即載入,因為與記憶體相比,硬碟的速度非常慢。因此,我們將在結構體中新增一個 preloadDistance 值,這樣當我們在該值範圍內移動時,聲音就會載入到緩衝區中,當我們在 activateDistance 值範圍內移動時,聲音就會開始播放。很酷吧!

最後,由於我們很可能會有不止一個聲音源(如果只有一個聲音源,遊戲就會很無聊),我們將把我們的結構體放入 C++ 向量中(如果你不知道向量是什麼,它只是一個數組,但功能更多),我們稱之為 pipeline。我們還需要新增一些功能,從管道中刪除“靜默”的聲音源,並釋放記憶體,但這我們稍後再說。

為了說明所有這些是如何結合在一起的。

這個圖說明了 preloadDistanceactivateDistancesourcePos 在“遊戲內”檢視中的位置。

因此,概括一下這個過程

  • 當玩家進入外部紅色球體時,就會建立一個新的 newSource 結構體,聲音被載入到緩衝區中,並被推送到 pipeline 中。
  • 當玩家進入黃色球體時,聲音就開始播放,並且當玩家朝內側的白色球體移動時,聲音會變得越來越響,直到在白色球體處達到最大音量。
  • 反過來,當玩家遠離白色球體時,聲音的音量會逐漸降低,直到玩家離開黃色球體,此時聲音會關閉,但仍然保留在 pipeline 中。
  • 當玩家離開紅色球體時,聲音源就會從 pipeline 中移除並銷燬(剔除),這樣就不會佔用不必要的記憶體。
華夏公益教科書