[英]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 個采樣器。
總紋理計數更高,因為其他着色器階段也可以使用紋理。
處理它的正確方法是執行以下操作之一:
#3 是唯一不需要更改數據的解決方案。 但請注意:如果您經常渲染這輛車(例如,每幀數千次),則 state 更改開銷可能是性能問題。 #1 和#2 的某種組合是通常首選的方法。
順便說一句,如果您的 model 只有幾百個面,但有50 個紋理,那么建模過程中可能出現了嚴重錯誤。
不可能像那樣使用任意數量的紋理,而不是直接使用。
基本上有3種解決方案:
為單個 object 切換 50 個紋理將很快變成低性能的噩夢。 使用紋理圖集。
多重紋理旨在提供多個紋理層,如顏色層、凹凸層、光澤度等。但它們不能用於替換圖集。
此外,如果您的 model 由不同材料的部件組成,請將其拆分。 每種材料都在自己的網格中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.