我正在使用片段着色器在GPU上进行一些射线跟踪...

如何计算相对于屏幕坐标的纹理坐标偏导数,以便可以使用textureGrad GLSL函数执行过滤后的纹理查找? br />
是否需要使用射线微分?

如果是,那么如何?

解释射线平面相交的导数计算的示例(使用原点和方向法向矢量,使用在平面上放置一个点的平面和法向矢量)将是不错的选择,尽管一般情况下的指针也会受到赞赏...

评论

我实际上不确定执行此操作的通常方法是什么,但是如果您能以某种方式知道此交点处的像素大小,则可以将epsilons添加到命中位置以获得数值导数,并使用该像素大小来知道什么要使用的MIP级别。

这个问题是相关的,并且在答案中有一些不错的信息:stackoverflow.com/q/1813303/2817105

#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