OpenGL mipmap level计算的一些思考

根据OpenGL spec,lod的计算涉及到缩放系数 ρ \rho ρ的计算,其公式为(为了方便,我们仅讨论2d贴图的情况)

ρ = m a x { ∂ u ∂ x 2 + ∂ v ∂ x 2 , ∂ u ∂ y 2 + ∂ v ∂ y 2 } \rho = max \left \{ \sqrt{ \frac{\partial u}{\partial x}^2 + \frac{\partial v}{\partial x}^2 }, \sqrt{ \frac{\partial u}{\partial y}^2 + \frac{\partial v}{\partial y}^2 } \right \} ρ=maxxu2+xv2 ,yu2+yv2

这里 u u u v v v不是规格化坐标,而是texel坐标, x x x y y y是屏幕坐标, u u u v v v是关于 x x x y y y的函数。

对于屏幕像素 P P P,我们假设其水平方向两个点屏幕坐标分别为

P 0 = ( x , y ) P 1 = ( x + 1 , y ) \begin{aligned} P_0 &= (x,y) \\ P_1 &= (x+1, y) \end{aligned} P0P1=(x,y)=(x+1,y)

对应的贴图上的点分别为

r 0 = < u ( x , y ) , v ( x , y ) > r 1 = < u ( x + 1 , y ) , v ( x + 1 , y ) > \begin{aligned} \mathbf r_0 &= <u(x,y),v(x,y)> \\ \mathbf r_1 &= <u(x+1,y),v(x+1,y)> \end{aligned} r0r1=<u(x,y),v(x,y)>=<u(x+1,y),v(x+1,y)>

我们可以计算 r 0 r 1 \mathbf{r_0r_1} r0r1,有

r 0 r 1 x = u ( x + 1 , y ) − u ( x , y ) ≈ ∂ u ∂ x r 0 r 1 y = v ( x + 1 , y ) − v ( x , y ) ≈ ∂ v ∂ x ∥ r 0 r 1 ∥ ≈ ∂ u ∂ x 2 + ∂ v ∂ x 2 \begin{aligned} \mathbf{r_0r_1}_x &= u(x+1,y) - u(x,y) \approx \frac{\partial u}{\partial x} \\ \mathbf{r_0r_1}_y &= v(x+1,y) - v(x,y) \approx \frac{\partial v}{\partial x} \\ \|\mathbf{r_0r_1}\| & \approx \sqrt{ \frac{\partial u}{\partial x}^2 + \frac{\partial v}{\partial x}^2 } \end{aligned} r0r1xr0r1yr0r1=u(x+1,y)u(x,y)xu=v(x+1,y)v(x,y)xvxu2+xv2

可以看出,OpenGL中的公式是贴图多边形两个边长与屏幕像素边长的比值。(贴图上对应的多边形不一定是平行四边形,但是还是近似看作平行四边形)

像素对应的贴图多边形通常不是正方形的,意味着在 u u u v v v方向相对于屏幕 x x x y y y方向的比例系数通常是不相等的,那么如何选择?

根据Pyramidal Parametrics,作者建议使用opengl spec使用的公式,paper中引用了Texture Mapping Polygons in Perspective,其中How to choose d有一些讨论,可能paper过于久远,部分公式没有显示。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值