如何计算相对于屏幕坐标的纹理坐标偏导数,以便可以使用
textureGrad
GLSL函数执行过滤后的纹理查找? br /> 是否需要使用射线微分?
如果是,那么如何?
解释射线平面相交的导数计算的示例(使用原点和方向法向矢量,使用在平面上放置一个点的平面和法向矢量)将是不错的选择,尽管一般情况下的指针也会受到赞赏...
#1 楼
是的,光线差异是必经之路。 Igehy的Paper介绍了它们用于过滤纹理查找的用例。生成主光线时,需要初始化微分以反映像素足迹。当光线穿过场景时,您会在每次反弹时更新差异。在进行纹理查找时,通常需要将差异投影到s,t纹理空间(又称为UV),通常是将表面参数空间作为中间对象。射线表面相交的导数的计算在pbrt中实现:
此处的表面由点p,法线n和两个切向量dPdu和dPdv来描述。所得的dudx,dudy,dvdx和dvdy是曲面的u,v参数相对于屏幕空间x和y的微分。从表面参数到纹理空间的转换在这里发生。
评论
$ \ begingroup $
一个完整的渲染器之外的隔离实现发布在此处:groups.google.com/forum/?hl=zh-CN#!topic/comp.graphics.algorithms/…
$ \ endgroup $
– Stefan Werner
17年12月13日在9:35
评论
我实际上不确定执行此操作的通常方法是什么,但是如果您能以某种方式知道此交点处的像素大小,则可以将epsilons添加到命中位置以获得数值导数,并使用该像素大小来知道什么要使用的MIP级别。这个问题是相关的,并且在答案中有一些不错的信息:stackoverflow.com/q/1813303/2817105