mipmap似乎是由OpenGL自动处理的,片段着色器提供的功能似乎是返回像素对应的采样点的颜色,那么opengl是如何自动处理mipmap的呢?
bgtovc5b1#
使用texture(tex, uv)函数时,它使用uv相对于窗口坐标的导数来计算碎片在纹理空间中的覆盖区。对于具有各向同性过滤器的2D纹理,覆盖区的大小可以计算为:
texture(tex, uv)
uv
ρ = max{ √((du/dx)² + (dv/dx)²), √((du/dy)² + (dv/dy))² }
这个函数计算紫外线在水平和垂直方向上的变化,然后取两者中较大的一个。ρ的对数结合其他参数(如LOD偏差、钳位和过滤器类型)确定了纹理像素在金字塔中的采样位置。然而,在实际中,该实现并不进行微积分运算来确定导数,而是使用数值近似。通常通过以四个一组的方式对片段进行着色(又称“quads”),并通过减去组中相邻片段中的uv来计算导数。这反过来可能需要“helper invocations”,其中着色器是为"s未被基元覆盖,但仍用于派生。这也是为什么历史上,自动mipmap级别选择在片段着色器之外不起作用。该实现也不需要使用上述ρ的公式,它可以在一些合理的约束条件下近似ρ,各向异性过滤使公式更加复杂,但其思想是相同的--使用隐式导数来确定在哪里对mipmap进行采样。如果自动导数机制不可用(例如,在顶点或计算着色器中),则由您负责计算它们并使用textureGrad函数代替。
textureGrad
1条答案
按热度按时间bgtovc5b1#
使用
texture(tex, uv)
函数时,它使用uv
相对于窗口坐标的导数来计算碎片在纹理空间中的覆盖区。对于具有各向同性过滤器的2D纹理,覆盖区的大小可以计算为:
这个函数计算紫外线在水平和垂直方向上的变化,然后取两者中较大的一个。
ρ的对数结合其他参数(如LOD偏差、钳位和过滤器类型)确定了纹理像素在金字塔中的采样位置。
然而,在实际中,该实现并不进行微积分运算来确定导数,而是使用数值近似。通常通过以四个一组的方式对片段进行着色(又称“quads”),并通过减去组中相邻片段中的
uv
来计算导数。这反过来可能需要“helper invocations”,其中着色器是为"s未被基元覆盖,但仍用于派生。这也是为什么历史上,自动mipmap级别选择在片段着色器之外不起作用。该实现也不需要使用上述ρ的公式,它可以在一些合理的约束条件下近似ρ,各向异性过滤使公式更加复杂,但其思想是相同的--使用隐式导数来确定在哪里对mipmap进行采样。
如果自动导数机制不可用(例如,在顶点或计算着色器中),则由您负责计算它们并使用
textureGrad
函数代替。