关于ddx/ddy重建法线在edge边沿上的artifacts问题

经验证,原来ddx、ddy这两个操作,在forward rendering与deferred rendering中存在着很微妙的语义区别。

在forward rendering中,GPU shader会自动地判断其2x2区域是否仅有部分落在当前绘制的三角面所覆盖的interpolate范围内。

而在dr中,在将ddx/ddy操作应用于一个NDC quad时,GPU shader这一免费的“非法校验”操作便失效了。用于计算ddx/ddy的2x2像素区域有可能一部分位于三角面A、而另一部分则位于三角面B。也就是说:参与ddx/ddy运算的像素,有可能超出了同一三角面的插值范围,从而导致ddx/ddy得到错误的结果。从而导致模型edge上的artifact。这一问题在dr中使用像素world坐标重建几何法线时(normalize(cross(ddx(posW), ddy(posW)))),尤为突出,而且真正理解上述原因的人少之又少。

总结:使用ddx/ddy,切记一定要确保其2x2区域位于同一三角面的光栅化范围内,不能跨三角面。在DR中,GPU shader不会自动地保障上述前提成立,所以没有引入其他额外机制的前提下,只能避免使用ddx/ddy计算几何法线。

附图1:deferred rendering,使用ddx/ddy重建法线,存在artifacts

附图2:forward rendering,使用ddx/ddy计算法线,不存在artifacts

时间: 2024-12-03 06:38:17

关于ddx/ddy重建法线在edge边沿上的artifacts问题的相关文章

HLSL ddx / ddy

[HLSL ddx / ddy] 在光栅化的时刻,GPUs会在同一时刻并行运行很多Fragment Shader,但是并不是一个pixel一个pixel去执行的,而是将其组织在2x2的一组pixels分块中,去并行执行. 偏导数就正好是计算的这一块像素中的变化率.从下图可以看出来ddx 就是右边的像素块的值减去左边像素块的值,而ddy就是下面像素块的值减去上面像素块的值.其中的x,y代表的是屏幕坐标. [偏导数的应用] 1.LOD的确定. 大家应该都知道mipmap 的用处,但是可能并不知道mi

angularJS 在edge浏览器上传文件,无法主动触发ng-click

今天发现的问题 在谷歌浏览器一直运行良好的功能,在edge浏览器不能使用. 代码参考我的另一篇博客:WebAPI Angularjs 上传文件 不能运行的原因 下图红框中的代码在edge浏览器中无法执行,也就不能执行下面的上传文件代码. 解决方案 既然原因找到了,就可以寻找解决方案了,找了一下午,有一篇有用的文章:angular ng-click程序触发,方法 我的解决方案(注意加粗加大的代码[关键哟]) JS代码如下: define(['app'], function (app) { app.

【转】法线贴图原理

原文地址http://www.cnblogs.com/flytrace/p/3387748.html 我算个笨人吧.笨人以前弄懂一些东西后,讲给笨人听往往更有效.看之前请自行具备图形学关于光照的基础知识. >> world/object space normal map 我们先讲基于世界或模型坐标的法线贴图(world/object space normal map).不常用,但是基础. 首先,请无视你之前google到的所谓通过Photoshop生成法线贴图类似文章,美术除外.那只是一种利用

【转载】法线贴图Nomal mapping 原理

法线贴图多用在CG动画的渲染以及游戏画面的制作上,将具有高细节的模型通过映射烘焙出法线贴图,贴在低端模型的法线贴图通道上,使之拥有法线贴图的渲染效果,却可以大大降低渲染时需要的面数和计算内容,从而达到优化动画渲染和游戏渲染的效果. 现在好多3d网游都没有法线贴图啊,呵呵,<giant>就没有. CG:计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学.简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形

Esfog_UnityShader教程_NormalMap法线贴图

咳咳,好久没有更新了,一来是这段时间很忙很忙,再来就是自己有些懒了,这个要不得啊,赶紧补上.在前面我们已经介绍过了漫反射和镜面反射,这两个是基本的光照类型,仅仅依靠它们就想制作出精美的效果是远远不够的,这一篇我们就来了解一下如何利用一种叫做法线贴图的技术并结合我们前面讲过的知识来制作出更精细的效果. 法线贴图NormalMap 首先要提到的是,什么是法线贴图,如果大家想看更专业的解释可以自行求助搜索引擎,这里我说一下我的个人理解:在游戏中,如果角色或物体模型做的越精细(面数越多),那么渲染后效果

如何在Microsoft Edge浏览器中添加一个Hello World插件

注:本文提到的代码示例下载地址> How to add a Hello World extension to Microsoft Edge Microsoft Edge 随着Win 10一起推出,是微软现在主推的浏览器.Edge 相比较于IE, 有更强的交互性,安全性,提供了更好的用户体验.而且这次Edge浏览器也开始支持浏览器插件喽. Edge 上的插件跟其他Chrome, FireFox等浏览器上的插件类似.但其API还在开发当中,截止到目前,已经可以支持大部分的API了.如果想要看具体的A

【Unity Shaders】学习笔记——SurfaceShader(七)法线贴图

[Unity Shaders]学习笔记——SurfaceShader(七)法线贴图 转载请注明出处:http://www.cnblogs.com/-867259206/p/5627565.html 写作本系列文章时使用的是Unity5.3. 写代码之前: 当然啦,如果Unity都没安装的话肯定不会来学Unity Shaders吧? 阅读本系列文章之前你需要有一些编程的概念. 在VS里面,Unity Shaders是没有语法高亮显示和智能提示的,VS党可以参考一下这篇文章使代码高亮显示,也可以下载

【Unity Shaders】法线纹理(Normal Mapping)的实现细节

写在前面 写这篇的目的是为了总结我长期以来的混乱.虽然题目是"法线纹理的实现细节",但其实我想讲的是如何在shader中编程正确使用法线进行光照计算.这里面最让人头大的就是各种矩阵运算和坐标系之间的转换,很容易因为坐标系错误而造成光照结果的错误. 我们将要讨论以下几个问题: 为什么法线纹理通常都是偏蓝色的? 在Unity里,法线纹理是需要把"Texture Type"设置成"Normal Map"才能正确显示,为什么? 把"Textur

StreamSets 设计Edge pipeline

edge pipeline 运行在edge 执行模式,我们可以使用 data collector UI 进行edge pipeline 设计, 设计完成之后,你可以部署对应的pipeline到edge 设备 可以设计的edge pipeline edge 发送pipeline edge 发送pipeline 使用特定的orgin读取edge设备上的数据,这个pipeline 可以在将数据发送到data collector 之前进行数据的处理 edge 接收pipeline 接收pipeline可