繁体   English   中英

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

[英]How does a GLSL sampler determine the minification, and thus the mipmap level, of a texture?

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM