跨平臺遊戲程式設計:使用 gameplay3d/材質詳解
外觀
如你所知,gameplay3d 中的 模型 是 網格 的一個具體例項,而網格由一個或多個 網格部件 組成。
為了在 gameplay3d 中渲染 模型,該 模型 中的每個 網格部件 都必須關聯一個 材質。由於每個 網格部件 可以擁有不同的 材質,因此 模型 的不同部分可以以不同的方式進行渲染。例如,如果你有一個穿著盔甲的角色,你可以將金屬材質應用於盔甲,而將簡單的紋理應用於 模型 的其餘部分。
一個 材質 包含一個或多個 技術。使用 技術 的目的是在執行時輕鬆切換渲染技術,而無需在 網格部件 上設定完全新的材質。例如,你可能有一個 模型,當它靠近攝像機時,你為它應用了凹凸貼圖 技術,但當你遠離攝像機時,你切換到簡單的紋理 技術,以便提高效能。
每個 技術 可以擁有一個或多個 流程,每個流程對應一個 OpenGL 繪製呼叫。為了使用多流程渲染技術,你需要在你的 技術 中新增多個 流程。
流程 包含
- 一個 效果,它基本上表示一個 GLSL 著色器程式(即頂點著色器和片段著色器);
- 有關渲染狀態的各種資訊(例如要應用的混合函式、是否啟用深度測試等);
- 一個 頂點屬性繫結,它封裝(或者模擬,如果你的硬體不支援)一個 OpenGL VAO(頂點屬性物件),並說明
網格的資料如何與 GLSL 著色器程式中的輸入相關聯。
呼!這似乎是需要記住的長長的清單,但你會發現這個系統提供了很多靈活性,可以以簡潔有序的方式安排你的渲染行為。
以下是可能無法看到你的模型(或模型全部顯示為黑色)的一些常見原因。
- 你沒有設定著色器使用的所有必需的統一變數。你是否記得為著色器中使用的 每個 統一變數呼叫以下函式之一?
material->getParameter([uniformName])->setValue([uniformValue]);material->getParameter([uniformName])->bindValue([插入引數]);或material->setParameterAutoBinding([uniformName], [自動繫結名稱]).
- 你的模型使用的網格不包含著色器所需的所有屬性(即每個頂點資料)。如果你的模型是在 3D 建模程式中生成的,那麼該程式是否匯出了著色器所需的(例如凹凸貼圖所需的切線和副法線資料)所有必要的每個頂點資料?請注意,gameplay-encoder 可以使用
-tb選項為不包含切線和副法線資料的 FBX 模型生成切線和副法線資料。
- 你的網格資料已損壞。如果你以過程方式建立了你的網格,或者你的 3D 建模程式中的 FBX 匯出器存在錯誤,則可能會出現此問題。