mipmap如何在opengl中使用片段着色器?

gojuced7  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(139)

mipmap似乎是由OpenGL自动处理的,片段着色器提供的功能似乎是返回像素对应的采样点的颜色,那么opengl是如何自动处理mipmap的呢?

bgtovc5b

bgtovc5b1#

使用texture(tex, uv)函数时,它使用uv相对于窗口坐标的导数来计算碎片在纹理空间中的覆盖区
对于具有各向同性过滤器的2D纹理,覆盖区的大小可以计算为:

ρ = max{ √((du/dx)² + (dv/dx)²), √((du/dy)² + (dv/dy))² }

这个函数计算紫外线在水平和垂直方向上的变化,然后取两者中较大的一个。
ρ的对数结合其他参数(如LOD偏差、钳位和过滤器类型)确定了纹理像素在金字塔中的采样位置。
然而,在实际中,该实现并不进行微积分运算来确定导数,而是使用数值近似。通常通过以四个一组的方式对片段进行着色(又称“quads”),并通过减去组中相邻片段中的uv来计算导数。这反过来可能需要“helper invocations”,其中着色器是为"s未被基元覆盖,但仍用于派生。这也是为什么历史上,自动mipmap级别选择在片段着色器之外不起作用。
该实现也不需要使用上述ρ的公式,它可以在一些合理的约束条件下近似ρ,各向异性过滤使公式更加复杂,但其思想是相同的--使用隐式导数来确定在哪里对mipmap进行采样。
如果自动导数机制不可用(例如,在顶点或计算着色器中),则由您负责计算它们并使用textureGrad函数代替。

相关问题