2011-07-22 81 views
2

我正在嘗試爲使用OpenGL的遊戲繪製汽車。汽車對象存儲在帶有.mtl文件的.obj文件中。OpenGL - 同一對象的不同表面上的不同紋理

汽車有500多個頂點,100多個面孔,需要使用我自己的頂點和片段着色器應用於他們的超過50種不同紋理。我通過使用緩衝區對象解決了這個問題,它一次發送關於我的對象的所有信息。我的問題是試圖將不同的紋理應用於同一個對象的不同表面。

我發現這個問題的答案是結合的紋理到一定的紋理數(即GL_TEXTURE0,GL_TEXTURE1等...),並在Sampler2D傳遞到片段着色器引用它。但是,我可以以這種方式存儲超過50個紋理嗎?據我可以告訴它去GL_TEXTURE32。

另外,如何讓着色器僅將紋理應用到汽車物體的某個面上?

回答

7

您無法以這種方式呈現模型,您可以一次綁定所有紋理。片段着色器,即使是高端的GL 4.1級硬件,也只能訪問16個紋理。也就是說,它只能有16個採樣器。

由於其他着色器階段也可以使用紋理,因此紋理總數會更高。

對付它正確的方法是做下列之一:

  1. 返回到您的建模和讓他們減少了模型的貼圖數量。
  2. 讓工具創建紋理圖集(即:將所有圖像放入單個紋理),適當地更改模型的紋理座標。根據您計劃支持的硬件,這可能是一個大的2D紋理或2D紋理陣列。後者將需要紋理座標的第三個值:數組中圖像的索引。
  3. 按紋理排序三角形。對於每個紋理,渲染使用該紋理的所有三角形。

#3是唯一不需要更改數據的解決方案。但要注意的是:如果你經常渲染這輛車(例如,每幀數千次),狀態變化開銷可能是性能問題。 #1和#2的一些組合是通常優選的方法。

順便說一句,如果你的模型只有幾百面,但是紋理,那麼在建模過程中可能會出現可怕的錯誤。

1

不可能像這樣使用任意數量的紋理,而不是以直接的方式使用。

基本上有3個解決方案:

  • 使用更少的紋理
    • 包幾個單獨的紋理成冊。這需要你 來調整紋理座標和照顧創建mipmap (雖然一個體面的工具會自動爲你做)。您可能需要小心留下足夠的邊界以進行各向異性過濾。
    • 將幾個單獨的紋理打包到一個數組紋理中。沒有問題的貼圖和ANISO,但需要硬件支持(GL 3.1卡)
  • 分手了你的模型
    • 更多的繪製調用和更多狀態變化和流水線停頓每車(壞性能)
    • 解決方案:Draw eg在一個批次中的所有車身,在一個批次中的所有的輪胎,而在另一個減少狀態的所有燈光變化
  • 使用細節紋理和更少的「總體低細節」紋理
    • 相似,你怎麼紋理上地形
    • 結合在像素着色器給每輛汽車的個性的外觀
0

開關50個紋理單一對象將很快變成一個低性能的夜晚母馬。使用紋理圖集。

多層紋理是爲了提供多個紋理層,如顏色層,凹凸層,光澤度等,但它們不能用於替換圖集。

此外,如果您的模型由不同材質的零件組成,請將其拆分。每種材料都有自己的網格。

相關問題