GLSL采样器如何确定纹理的缩小,从而确定mipmap级别?

时间:2011-09-09 21:25:25

标签: opengl opengl-es glsl mipmaps

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

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

在我的情况下,我正在合成(在着色器内)我用来对纹理进行采样的纹理坐标。实际上,我的纹理坐标不是基于任何传入的变化。即使我在这个纹理上启用了mipmapping,它似乎也没有任何效果。这是预期的吗?我是否需要自己计算LOD并将bias参数用于texture2D? (没有texture2DLOD,因为我正在使用ES)

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:2)

您可以任意计算纹理坐标,并且着色器将在一个限制内相应地行动。您的计算不能涉及任何条件逻辑。它们可以涉及变化,制服,常数,从其他纹理采样的值,无论你想要什么。但是当你在那里作为一个?:运算符滑落的那一刻(更不用说if语句了),你就遇到了麻烦。

既然你在OpenGL ES领域,你就没有足够的工具让自己摆脱困境。 Desktop GL 3.0为您提供textureGrad个函数集,允许您在到达条件逻辑之前计算渐变。但如果没有这个,你就无能为力。