OGL(教程22) 模型載入

2021-08-29 03:11:27 字數 1285 閱讀 2108

背景知識:

我們不能手動的建立複雜的模型。正如你所想象的,為每個頂點指定位置和其他的屬性,並且要在縮放的時候保持正確是不現實的。乙個盒子、金字塔或者是簡單的表面是ok的,但是對於人臉這種複雜的網格結構就不可行了。現實的世界或者是商業的應用,處理的網格模型都是通過設計師設計的模型,他們使用blender、maya、3ds max來設計。這些應用為設計師提供高階的工具來來建立複雜的模型。但模型被設計好之後,他會儲存成多種格式的檔案。每個檔案都包含了整個幾何體的定義。它可以被載入到遊戲的引擎,前提是這個引擎能夠識別檔案的格式。檔案的內容被用來填充頂點和索引緩衝。如何解析模型檔案的內容,對於正確載入模型至關重要。

開發你自己的解析器是非常耗時的。如果你要載入各種各樣的模型,你需要對每個格式的檔案寫乙個解析器。有些格式是很簡單的,但是有些格式很複雜,如果每個都實現,這個很耗時,而且這些不是3d程式設計的核心內容。因此,本節引入第三方的載入模型的庫,他能為我們載入各種各樣的模型。

這個開源的庫叫做open asset import library,簡稱assimp。它能夠載入很多3d格式的檔案,包括流行的格式檔案。對於windows和linux都是可以用的,它能夠很好的和c++整合。

這個具體怎麼配置,參考我之前的章節:

**注釋:

(mesh.h:50)

class mesh

; std::vector m_entries;

std::vector m_textures;

};

mesh類代表了assimp和opengl之間的介面。這個類中的方法loadmesh()方法,需要傳遞檔案的名字,使用assimp載入模型,然後建立頂點緩衝,索引緩衝,還有貼圖物件,這些貼圖物件包含了模型的資料。為了能夠渲染網格,我們使用函式render()。mesh類的內部會選擇對於的方法來載入模型。assimp使用aiscene物件來代表載入好的網格。aiscene包含了網格結構。aiscene物件至少包含乙個網格結構。複雜的模型包含多個網格結構。mesh類的m_entries成員是meshentry的向量,其中每個值都是對應乙個aiscene物件。這個結果包含頂點緩衝、索引緩衝、還有材質索引。從現在開始,乙個材質就是一盞貼圖,由於網格實體可以共享材質,我們使用乙個向量m_textures記錄貼圖。meshentry::materialindex指向m_textures中的某個。

(mesh.cpp:77)

bool mesh::loadmesh(const std::string& filename)

else

return ret;

}

Vulkan學習 22 載入模型

我們暫時不使用光照,只簡單地將紋理貼在模型上。在這裡,我們載入的模型叫做 chalet hippolyte chassande baroz。我 們對它的大小和方向進行了調整 這一模型大概由 50 萬面三角形構成。大小為1.5x1.5x1.5。如果使用的模型大於這一尺寸,讀者就需要對使用的檢視矩陣進行...

OGL(教程35) 延遲渲染1

從17節開始,到現在對燈光的處理就是所謂的向前渲染或者向前著色。這是最直接的方式,我們在頂點著色器中對物體的各個頂點做變換 對法線進行變化,把位置變換到裁剪空間 然後在fs中對畫素進行光照計算。對於每個物件的每個畫素只能呼叫一次fs,我們需要對fs提供所有的光源資訊,然後在計算這個畫素的光照的時候全...

OGL(教程41) 物體運動模糊

背景知識 執行模糊是高速3d遊戲中常用的技術,它的目的是在運動的物體上加入模糊效果。這個增加了玩家的真實體驗感。運動模糊可以使用多種方式實現。基於模糊的攝像機,它的焦點在移動的攝像機,還有一種方式是基於模糊的物體。本節我們使用一種技術來實現後者。運動模糊背後的原理是,我們可以計算乙個運動的向量,叫做...