我目前正在使用GLES30为GLES20着色器语言重写着色器。
我遇到了需要转换的着色器调用函数textureLod
的问题,该函数使用特定的细节级别对当前绑定的纹理进行采样。使用GLES20时,此调用在片段着色器which can only be called within the vertex shader内进行。
我想知道,如果我用功能texture2D
调用替换它,我是否可能会破坏着色器的功能,或者只是降低它的性能?在原始着色器中进行textureLod
调用的所有实例都使用零细节级别。
答案 0 :(得分:1)
如果您将来自textureLod
的呼叫切换到texture2D
,您将失去对正在采样的mip级别的控制权。
如果正在采样的纹理只有一个mip级别,那么无论传递给textureLod
的lod参数如何,这两个调用都是等效的,因为只有一个级别可以被采样。
如果原始着色器始终对顶部mip级别(= 0)进行采样,则更改不太可能会影响性能,因为采样较低的mip级别更有可能提供更好的纹理缓存性能。如果可能,您可以让您的采样纹理仅包含顶级以保证等效(除非在其他地方需要mip级别)。如果这是不可能的,那么执行将是不同的。如果样本用于“直接”纹理化,假设生成的mip链很好,结果可能会非常相似。如果它用于其他目的(例如着色器中的逻辑),则分歧可能更大。如果没有看到实际的着色器,很难预测。
另请注意,如果纹理样本在循环或条件中使用,并且已在其生命周期中的任何点移植到/来自DirectX HLSL着色器,则对textureLod
的调用可能是HLSL不允许动态循环内的梯度指令(其中HLSL等效于texture2D
,但不等同于textureLod
)。这在HLSL中是必需的,即使纹理只有一个mip级别。