我正在使用OpenGL ES(通过WebGL),但是我认为这个问题也适用于完整的OpenGL配置文件。
假设我创建了具有完整mipmap级别的OpenGL纹理,并将其TEXTURE_MIN_FILTER设置为NEAREST_MIPMAP_NEAREST。还要假设我有一个采样该纹理的片段着色器。根据纹理的缩小程度选择mipmap级别,但是如何选择缩小程度呢?
就我而言,我正在合成(在着色器内)用于采样纹理的纹理坐标。实际上,我的纹理坐标不是基于任何传入的变化。即使在此纹理上启用了mipmapping,它似乎也没有任何作用。这是预期的吗?我是否需要自己计算LOD并使用biasing参数进行texture2D? (因为我使用的是ES,所以没有Texture2DLOD)
相邻像素块是并行计算的。 (例如,IIRC PowerVR芯片一次执行4x4块。)当您在片段着色器中调用texture2D时,采样器将一次获取所有16个像素的所有16个采样,因此需要邻接信息来计算最小化水平。这就是为什么对相邻像素从纹理的附近区域进行采样如此重要的原因的一部分。
注意,这仅适用于片段着色器。在顶点着色器中,始终使用第一个mipmap级别,(除非使用了Texture2D的Lod版本。)
您可以任意计算纹理坐标,并且着色器将相应地起作用……在一个限制之内。您的计算不能涉及任何条件逻辑。它们可以涉及变化,统一,常数,从其他纹理采样的值,无论您想要什么。但是,当您滑入一个?:运算符的那一刻(更不用说if语句)时,您就会遇到麻烦。
而且由于您在OpenGL ES领域,所以您实际上并没有使自己摆脱困境的工具。 Desktop GL 3.0为您提供了textureGrad
功能集,可让您在达到条件逻辑之前计算梯度。但是如果没有这些,您将无能为力。