问题重构 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 级别。
我目前正在为 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 级别。