2015-05-19 33 views
1

我目前正在爲GLES20着色器語言重寫GLES30中的着色器。重構GLES30着色器的問題?

我碰到了一個障礙,我需要轉換的着色器調用函數textureLod,該函數使用特定的細節級別對當前綁定的紋理進行採樣。此調用在使用GLES20時在片段着色器which can only be called within the vertex shader內進行。

我在想,如果我用函數texture2D調用這個函數替換它,我是否可能會影響着色器的功能,或者只是降低它的性能?在原始着色器中調用textureLod的所有實例都使用零級細節。

+0

我已經使用了這個shadertoy,並且明確地將紋理的細節級別設置爲0.0,並且它似乎直接對紋理進行採樣。只是想知道這如何適用於GL.GL_NEAREST mipmapping上下文。 https://www.shadertoy.com/view/4slGWn –

回答

1

如果您將呼叫從textureLod切換爲texture2D,您將失去對正在採樣的mip級別的控制。

如果被採樣的紋理只有一個mip級別,那麼不管傳遞給textureLod的lod參數如何,這兩個調用都是等效的,因爲只有一個可以採樣的級別。

如果原始着色器總是對頂級mip級別(= 0)進行採樣,則更改可能不會損害性能,因爲採樣較低的mip級別可能會提高紋理高速緩存性能。如果可能的話,你可以讓你的採樣紋理只包含一個頂層以保證等價(除非其他地方需要mip級別)。如果這是不可能的,那麼執行會有所不同。如果樣本用於「直接」紋理化,假設生成的mip鏈很好,那麼結果很可能相當相似。如果它用於其他目的(例如着色器中的邏輯),那麼分歧可能更大。沒有看到實際着色器就很難預測。

另請注意,如果紋理採樣在循環或條件內使用,並且已在其生命週期中的任意位置移至/從DirectX HLSL着色器移植,則對textureLod的調用可能是HLSL的人工製品,不允許動態循環內的梯度指令(其中HLSL相當於texture2D,但不等於textureLod)。這在HLSL中是必需的,即使紋理只有一個mip級別。