问题重构 GLES30 着色器?

Issues refactoring GLES30 shader?

我目前正在为 GLES20 着色器语言重写一个用 GLES30 编写的着色器。

我遇到了一个问题,我需要转换的着色器调用函数 textureLod,该函数使用特定的细节级别对当前绑定的纹理进行采样。此调用在片段着色器中进行,which can only be called within the vertex shader 使用 GLES20 时。

我想知道,如果我用函数 texture2D 的调用替换它,我是否可能会损害着色器的功能,或者只是降低它的性能?在原始着色器中进行 textureLod 调用的所有实例都使用零细节级别。

如果将调用从 textureLod 切换到 texture2D,您将无法控制正在采样的 mip 级别。

如果被采样的纹理只有一个 mip 级别,那么无论传递给 textureLod 的 lod 参数如何,这两个调用是等效的,因为只有一个级别可以被采样。

如果原始着色器始终对最高 mip 级别 (=0) 进行采样,则更改不太可能损害性能,因为对较低的 mip 级别进行采样更有可能提供更好的纹理缓存性能。如果可能,您可以让您的采样纹理只包含一个顶级以保证等效(除非其他地方需要 mip 级别)。如果这不可能,那么执行将有所不同。如果示例用于 'direct' 纹理,则结果可能会非常相似,假设生成了一个很好的 mip 链。如果它被用于其他目的(例如着色器中的逻辑),那么差异可能会更大。没有看到实际的着色器就很难预测。

另请注意,如果纹理样本在循环或条件中使用,并且已在其生命周期的任何时候移植 to/from DirectX HLSL 着色器,则对 textureLod 的调用可能是 HLSL 的产物,不允许在动态循环中使用梯度指令(texture2D 的 HLSL 等价物是,但 textureLod 的等价物不是)。这在 HLSL 中是必需的,即使纹理只有一个 mip 级别。