8

我正在使用 OpenGL ES(通过 WebGL),但我认为这个问题也适用于完整的 OpenGL 配置文件。

假设我创建了一个具有完整 mipmap 级别的 OpenGL 纹理,并将其 TEXTURE_MIN_FILTER 设置为 NEAREST_MIPMAP_NEAREST。还假设我有一个片段着色器来采样这个纹理。mipmap级别是根据纹理的缩小程度来选择的,但是缩小程度是如何选择的呢?

就我而言,我正在合成(在着色器内部)用于对纹理进行采样的纹理坐标。事实上,我的纹理坐标不是基于任何传入的变量。即使我在这个纹理上启用了 mipmapping,它似乎也没有任何效果。这是预期的吗?我需要自己计算 LOD 并使用纹理 2D 的偏差参数吗?(没有texture2DLOD,因为我用的是ES)

4

2 回答 2

10

并行计算相邻像素块。(例如,IIRC PowerVR 芯片一次执行 4x4 块。)当您在片段着色器中调用 texture2D 时,采样器一次获取所有 16 个像素的所有 16 个样本,因此具有计算缩小所需的邻接信息等级。这就是为什么相邻像素从纹理的附近区域采样如此重要的部分原因。

请注意,这仅适用于片段着色器。在顶点着色器中,始终使用第一个 mipmap 级别,(除非您使用 Lod 版本的 texture2D。)

于 2011-09-12T16:50:57.017 回答
3

您可以任意计算纹理坐标,并且着色器将相应地采取行动......在一个限制内。您的计算不能涉及任何条件逻辑。它们可以涉及变化、统一、常量、从其他纹理采样的值,无论您想要什么。但是,当您在其中滑过 ?: 运算符(更不用说 if 语句)时,您就有麻烦了。

而且由于您处于 OpenGL ES 领域,因此您并没有真正的工具来摆脱这种麻烦。Desktop GL 3.0 为您提供了一textureGrad组函数,允许您在达到条件逻辑之前计算梯度。但没有它,你无能为力。

于 2011-09-09T21:44:26.557 回答