簡體   English   中英

OpenGL - 同一 object 的不同表面上的不同紋理

[英]OpenGL - Different textures on different surfaces of the same object

我正在嘗試為我正在使用 OpenGL 制作的游戲繪制汽車。 汽車 object 存儲在一個帶有隨附.mtl 文件的 .obj 文件中。

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

我發現這個問題的答案是將紋理綁定到某個紋理編號(即 GL_TEXTURE0、GL_TEXTURE1 等...)並將 Sampler2D 傳遞給引用它的片段着色器。 但是,我可以用這種方式存儲超過 50 個紋理嗎? 據我所知,它轉到 GL_TEXTURE32。

另外,我如何告訴着色器僅將紋理應用於汽車 object 的某個面?

您不能以這種方式渲染 model,您可以一次綁定所有紋理。 一個片段着色器,即使對於高端的 GL 4.1 級硬件,也只能訪問 16 個紋理。 也就是說,它只能有 16 個采樣器。

總紋理計數更高,因為其他着色器階段也可以使用紋理。

處理它的正確方法是執行以下操作之一:

  1. 返回到您的建模器並讓他們減少 model 的紋理計數。
  2. 使用工具構建紋理圖集(即:將所有圖像放入單個紋理中),適當更改模型的紋理坐標。 根據您計划支持的硬件,這可以是大型 2D 紋理或 2D 紋理陣列。 后者需要紋理坐標的第三個值:數組中圖像的索引。
  3. 按紋理對三角形進行排序。 對於每個紋理,渲染所有使用該紋理的三角形。

#3 是唯一不需要更改數據的解決方案。 但請注意:如果您經常渲染這輛車(例如,每幀數千次),則 state 更改開銷可能是性能問題。 #1 和#2 的某種組合是通常首選的方法。

順便說一句,如果您的 model 只有幾百個面,但有50 個紋理,那么建模過程中可能出現了嚴重錯誤。

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

基本上有3種解決方案:

  • 使用更少的紋理
    • 將幾個單獨的紋理打包成一個圖集。 這需要您調整紋理坐標並注意創建 mipmap(盡管一個不錯的工具會自動為您完成)。 您可能還需要小心為各向異性過濾留出足夠的邊界。
    • 將多個單獨的紋理打包到一個陣列紋理中。 mipmap 和 aniso 沒有問題,但需要硬件支持(GL 3.1 卡)
  • 拆分你的 model
    • 更多的繪制調用和更多的state 更改和每輛車的管道停頓(對性能不利)
    • 解決方案:例如繪制一批所有車身,一批繪制所有輪胎,另一批繪制所有燈,以減少 state 變化
  • 使用細節紋理和更少的“整體低細節”紋理
    • 類似於在地形上進行紋理處理的方式
    • 在像素着色器中組合,為每輛車提供單獨的外觀

為單個 object 切換 50 個紋理將很快變成低性能的噩夢。 使用紋理圖集。

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

此外,如果您的 model 由不同材料的部件組成,請將其拆分。 每種材料都在自己的網格中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM