簡體   English   中英

紋理坐標和優化GLSL着色器

[英]Texture coordinates and optimizing GLSL shaders

我正在討論以各種方式將紋理坐標傳遞給GLSL着色器的利弊。

我正在渲染很多實例數據。 我有一個基本模型,然后將“轉換矩陣”和“紋理/精靈索引”傳遞給着色器。 然后根據變換矩陣旋轉和平移每個模型,並根據以下代碼段確定紋理:

TexCoord0 = vec2(TexCoord.x+(TexIndex%16),TexCoord.y+(TexIndex/16))/16;

我對此不滿意的是,我已經對精靈和紋理大小進行了硬編碼。 我可以使用制服來傳遞這些信息,但是我仍然有一個局限性,就是我的精靈不能因實例而異(不是我有一個計划好的用例)。 而且,要確定子畫面的坐標,需要在GPU上進行更多的計算。

我可以使用的另一種方法是指定整個Rect,該Rect可以在紋理貼圖中定義精靈的位置,寬度和高度。 但是,這將需要指定4個浮點數(16個字節)的信息,而不是單個紋理索引字節。 乘以200K實例,我們正在查看大約3 MB的數據(除了其他數據)。 我不知道這在當今時代是否被認為是“很多”。

我應該專注於簡化GLSL着色器中的計算還是最小化緩沖區的大小? 我聽說將數據傳輸到GPU常常是瓶頸,但是與將其渲染到每一幀的頂點數相比,將數據重新復制到緩沖區很少。


同樣,我正在考慮取出模型轉換矩陣,分別用vec3vec2進行平移和旋轉(我只需要2度旋轉),這會將我從16個浮點數減為5個,然后我可以在頂點着色器中重建矩陣。 再次,這失去了一些靈活性,我不確定是否可以節省成本。

我嘗試以另一種方式進行操作,指定紋理矩形而不是字節索引,它實際上產生了巨大的速度提高(520 FPS至3600 FPS,或1.92ms /幀至0.27 ms /幀)。

減少計算似乎更重要,至少在我的GPU(Radeon HD 5700系列)上是如此。 也許只是模數是昂貴的,不確定。 我對結果很滿意; 我以更低的成本獲得了更多的靈活性!

暫無
暫無

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

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