Vulkan學習 22 載入模型

2021-09-17 08:21:38 字數 2748 閱讀 9197

我們暫時不使用光照,只簡單地將紋理貼在模型上。

在這裡,我們載入的模型叫做 chalet hippolyte chassande baroz。我

們對它的大小和方向進行了調整:

這一模型大概由 50 萬面三角形構成。

大小為1.5x1.5x1.5。如果使用的模型大於這一尺寸,讀者就需要對使用的檢視矩陣進行修改。

示例:

#define glm_force_radians

//用來使 glm::rotate這些函式使用弧度作為引數的單位

/**預設情況下,glm 庫的透視投影矩陣使用 opengl 的深度值範圍 (-

1.0,1.0)。我們需要定義 glm_force_depth_zero_to_one 巨集

來讓它使用 vulkan 的深度值範圍 (0.0,1.0)。

*/#define glm_force_depth_zero_to_one

#define glm_enable_experimental

//啟用glm 庫的雜湊函式

#include

//線性代數庫

//為了使用glm::rotate之類的矩陣變換函式

#include

#include

#define tinyobjloader_implementation

#include

#include

//重寫==運算子

bool

operator==(

const vertex& other)

const

//對 vertex 結構體進行雜湊的函式

//繫結頂點緩衝到指令緩衝物件--第三個引數為索引資料的型別

vkcmdbindindexbuffer

(commandbuffers[i]

,indexbuffer,0,

vk_index_type_uint32)

; stbi_uc* pixels =

stbi_load

(texture_path.

c_str()

,&texwidth,

&texheight,

&texchannels,

stbi_rgb_alpha)

;//載入模型檔案,填充模型資料到 vertices 和 indices

void

loadmodel()

/** 我們需要達到索引緩衝節約空間的目的。三角形表面的頂點是被多個三角形表面共用的,

而我們則是每個頂點都重新定義一次,vertices 向量包含了大量重複的頂點資料。

我們可以將完全相同的頂點資料只保留乙個,來解決空間。

這一去重過程可以通過 stl 的 map 或unordered_map 來實現:

*/std::unordered_mapuint32_t

> uniquevertices;

//將載入的表面資料複製到我們的 vertices 和 indices 向量中

for(

const

auto

& shape : shapes)

;/**

為了簡化 indices 陣列的處理,我們這裡假定每個頂點都是獨一無

二的,可以直接使用 indices 陣列的當前大小作為頂點索引資料。上面

**中的 index 變數的型別為 tinyobj::index_t,這一型別的變數包含了

vertex_index、normal_index 和 texcoord_index 三個成員變數。

我們使用這三個成員變數來檢索儲存在 attrib 陣列變數中的頂點資料:

attrib.vertices 是乙個浮點陣列,並非 glm::vec3 陣列,我們需要在使

用索引檢索頂點資料時首先要把索引值乘以 3 才能得到正確的頂點資料位

置。對於紋理座標資料,則乘以 2 進行檢索。對於頂點位置資料,偏移值

0 對應 x 座標,偏移值 1 對應 y 座標,偏移值 2 對應 z 座標。對於紋理

座標資料,偏移值 0 對應 u 座標,偏移值 1 對應 v 座標

*/vertex.pos =

;/**

vulkan的紋理座標的原點是左上角,而obj模型檔案格式假設紋理座標原點是左下角。

所以需要反轉紋理的 y 座標使兩個對應

*/vertex.texcoord =

; vertex.color =

;//優化頂點結構

if(uniquevertices.

count

(vertex)==0

) indices.

push_back

(uniquevertices[vertex]);

}}}

OGL(教程22) 模型載入

背景知識 我們不能手動的建立複雜的模型。正如你所想象的,為每個頂點指定位置和其他的屬性,並且要在縮放的時候保持正確是不現實的。乙個盒子 金字塔或者是簡單的表面是ok的,但是對於人臉這種複雜的網格結構就不可行了。現實的世界或者是商業的應用,處理的網格模型都是通過設計師設計的模型,他們使用blender...

vulkan管線學習8

介紹說這個是用來指定繪製的時候,有多少顏色緩衝,深度緩衝,多少次取樣,還有他們各自的內容是啥樣。然後這個是掛在vkframebuffer的 然後由於這個教程這裡只需要colorbuffer,所以只建立了乙個color attachment format這裡保持和swapchain一致,第二個好像關於...

vulkan管線學習1

安裝教程就隨便搜,都是大佬 那些安裝包可以這裡下 vk很先進,那早學晚學早晚要學,把他的思想以及流程學好了,然後就可以繼續學習做好看的效果了,以及之後webgpu出來,咱們知識遷移不需要太費勁,如果只會webgl opengl看這個有點費勁。第乙個東西是vkinstance這個。然後vk裡很多是用填...