位置: 编程技术 - 正文

Unity3d 使用DX11的曲面细分(unity dc)

编辑:rootadmin

推荐整理分享Unity3d 使用DX11的曲面细分(unity dc),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:unitydll,unity do,unity3d dots,unity3d dots,unity dxr,unity dxr,unity3d dots,unity dx12,内容如对您有帮助,希望把文章链接给更多的朋友!

Unity3d surface Shaderswith DX Tessellation

Unity3d surface shader 在DX上的曲面细分

I write this article, according to the unity3d official document, and look up some data in the web, and add to some idea by myself.

根据官方文档,并查阅了一些资料加上我个人的理解写出此文。

I write in two languages. One passage write in Chineseone passage translate into English, If I write some thing wrong, welcome to correct my article.

我用了两种语言,一段英文一段中文,英语语法错误,或者写的不对的各位可以告诉我及时改正

Thanks for my teacher correct my article.

感谢我的老师对本文写的不对的地方进行了一些修改

Surface Shadershave some support for Direct GPU Tessellation,

1. Tessellation is indicated by tessellate:FunctionName modifier. That function computes triangleedge and inside tessellation factors.

2. When tessellation is used, “vertex modifier” (vertex:FunctionName) is invokedafter tessellation,for each generated vertex in the domain shader. Here you’d typically todisplacement mapping.

3. Surface shaders can optionally compute Phong Tessellation to smooth model surface even without anydisplacement mapping.

Unity中Surface shader 支持 DX GPU曲面细分的原因在于:

1. 曲面细分函数用 tessellate:FunctionName 表示。这个函数能计算三角形边缘和一些曲面细分的内部因素。

2. 当曲面细分被使用时,“顶点函数”(vertex:FunctionName)在曲面细分之后被调用,在shader包括的物体之内的每个顶点都是如此。因此你可以再次进行贴图置换。

3. surface shader 能随意地计算 phong 曲面细分 来光滑模型的表面,甚至不需要贴图置换。

Current limitationsof tessellation support:

1. Only triangle domain - no quads, no isoline tessellation.

2. When tessellation is used,shader is automatically compiled intoShader Model 5.0 target, which means itwill only work on DX.

现在unity3d对曲面细分支持的局限性:

1. 只有三角形面片可以而四边形的不行,等&#;线曲面细分也不支持(isoline tessellation)。

2. 当使用曲面细分时,shader自动编译成 shader model 5.0 版本,因此曲面细分只能用在DX上(ShaderModel 5.0 → DirectX )。

The Displacement can be usedto instead the Bump Maping technique.The Bump Maping is illusion that can have concave-convex feeling, but the model is flat like before. The Displacement mapping can changemesh’s vertex transposition, chang the model that make it have trueconcave-convex.

贴图置换(Displacement mapping),可被用做现有凹凸贴图技术的临时替代技术,bumpmap只是假象,模型并没有真正凹凸,贴图置换是移动模型顶点,使模型真正产生了凹凸。

无细分,只有贴图置换的shader(No GPU tessellation, displacement in the vertex modifier)

Let’s start with a surface shader that does some displacement mapping without using tessellion.Base-on the amount come from Displacement mapping, move the vertex along their normals.我们先在不使用曲面细分的情况下贴图置换。基于贴图置换的数&#;,沿着法线移动顶点。

let's see the shader:

让我们看看shader

tex2Dlod - 2D texture lookup with specified level of detail and optional texel offset.tex2Dlod 以指定的细节级别和可选的位移来解析贴图In this vertex function,we move each vertex along their normals(depend on the _Displacement value);在这个顶点函数中,把每个顶点都向着法线方向偏移一些(取决于_Displacement的&#;)

The above shader is fairly standard:1. Vertex modifier disp samples the displacement map and moves vertices along their normals.2. It uses custom “vertex data input” structure (appdata) instead of default appdata_full. This is not needed yet, but it’s more efficient for tessellation to use as small structure as possible.3. Since our vertex data does not have 2nd UV coordinate, we add nolightmap directive to exclude lightmaps.上面的shader非常标准:1. 在定点函数disp内,每个顶点都根据displacement的&#;的大小沿着该点的法线移动2. 使用了自定义的顶点输出的结构体appdata,而不是默认&#;appdata_full。这个现在还用不到,但是结构体尽可能的小,会提高曲面细分的效率。3. 顶点数据没有uv坐标,在#pragma处加上nolightmap指令,就不包含光照贴图了

固定数量的曲面细分(Fixed amount of tessellation)

细化算法 The Refinement Algorithms

Let’s see how the vertex produce, according to the kinds of beginning cell, there are triangle and quads, as mentioned before, unity just support triangle, not quads. Its just refinement each layer with regulation. The base rule add new vertex to form new edges and planes in the low resolving.(Or though “cut corner” method),use recursion to smooth and refinement.DX used thePN-Triangles Algorithms to converts low resolution models into curved surfaces which are then redrawn as a mesh of finely tessellated triangles. Then eliminate the feint and the artificial things in games.让我们看看这些点是怎么生成的按照初始单元网&#;分类,包括三角形网&#;细分和四边形网&#;细分,前面已经提到了,unity只支持三角形网&#;细分,而不支持四边形。曲面细分就是用一定的规则对多边形网&#;进行逐层细化。细分模式的基本规则是从粗糙的大网&#;,通过添加新的顶点来形成新的边和面(或通过削角的办法形成新的边和面),这样递归地平滑细分,直到最终获得光滑曲面,DX采用了PN-Triangles算法能将低分辨率模型转化为弯曲表面,该表面之后可以被重新绘制成“高精度曲面细分”的三角形网&#;。用来消除游戏中本该是圆滑却是多边形的假象。

This approach is suitable if your model’s faces are roughly the same size on screen. Some script could then change the tessellation level from code, based on distance to the camera.如果整个模型在屏幕上的细分程度一样,使用这个方法很合适。有些脚本基于模型与相机的的距离来改变细分程度。

曲面细分函数tessFixed返回一个float4的&#;:xyz是三角形的三个顶点的细分程度,w是比例。在本shader里只是一个float常量来作为模型的细分程度。

以距离为基础的曲面细分(Distance-based tessellation)

We can also change tessellation level based on distance from the camera. For example, we could define two distance values; distance at which tessellation is at maximum, and distance towards which tessellation level gradually decreases.我们也能通过模型与相机的距离改变细分程度。举个例子,我们需要定义两个距离&#;;一个是距离相机最近的距离&#;,一个是最远的距离&#;。

We found the UnityDistanceBasedTess function In "Tessellation.cginc"

“Tessellation.cginc”中我们找到了UnityDistanceBasedTess函数

We can see the UnityDistanceBasedTess function is call theUnityCalcDistanceTessFactor function, we also found it in the "Tessellation.cginc";

我们能看到UnityDistanceBasedTess函数主要还是调用UnityCalcDistanceTessFactor这个函数,于是我们又在"Tessellation.cginc"中找到了它;

In the UnityCalcDistanceTessFactor function ,take the vertex chang to world space, then compute the distance between the vertex and the camera,finally compute the tess.在UnityCalcDistanceTessFactor函数中把点转换为世界坐标wpos,在求出点与同是世界坐标的相机的距离dist,再求出细分程度tess。

Here the tessellation function takes three parameters; the vertex data of three triangle corners before tessellation. This is needed to compute tessellation levels, which depend on vertex positions now. We include a built-in helper file “Tessellation.cginc” (in EditorDataCGIncludes) and call UnityDistanceBasedTess function from it to do all the work. That function computes distance of each vertex to the camera and derives final tessellation factors.这里的细分函数有三个参数;三角形的三个角在曲面细分之前顶点数据。这通过顶点位置来计算细分程度。我们声明包含帮助文件“Tessellation.cginc”(EditorDataCGIncludes中)并且调用其中的UnityDistanceBasedTess函数来做所有工作。那个函数计算每个顶点与相机的距离,并返回细分函数的float4&#;。

远(far):

Unity3d 使用DX11的曲面细分(unity dc)

近(close):

这个gif也能体现相机距离与细分程度的变化

基于边缘长度的曲面细分(Edge length based tessellation)

Purely distance based tessellation is good only when triangle sizes are quite similar.Tessellation levels could be computed based on triangle edge length on the screen - the longer the edge, the larger tessellation factor should be applied.单纯的基于距离的曲面细分只是在当在三角形大小差不多时效果很好。将要基于屏幕上的三角形边缘长度计算曲面细分,可以使用更大的细分程度

UnityEdgeLengthBasedTess function inbound three parameters v0, v1, v2 is the three vertices of the triangle.

UnityEdgeLengthBasedTess传入的v0,v1,v2是三角形的三个顶点

In UnityEdgeLengthBasedTess function compute the distance of the middle of two vertices and the camera’s postation(both two are in world space) , then compute the distance of two vertices, finally compute the tess;UnityCalcEdgeTessFactor中先求出两个点的中点与相机的距离(全是世界坐标),再求出两个点的距离,再求出细分程度For performance reasons, it’s advisable to call UnityEdgeLengthBasedTessCull function instead, which will do patch frustum culling. This makes the shader a bit more expensive, but saves a lot of GPU work for parts of meshes that are outside of camera’s view.由于性能的原因,可以适当的调用UnityEdgeLengthBasedTessCull函数代替(通过判断相机平截头体,对不在范围内的点不进行细分),调用这个代替函数虽然也浪费一些性能,但不必细分不必要的点

Phong细分(Phong Tessellation)

Before see the Phong tessellation shader, we need to know that theory.再看Phong曲面细分的shader之前先深入了解一下Phong曲面细分

This is the Phong tessellation by Tamy Boubekeu and Marc AlexaTamy Boubekeur和Marc Alexa 做出的phong曲面细分,

They explain the theory in a video.他们用一个视频来简要讲解做法

输入一个带有法线的三角形,在重心插入点来做线性细分

正交投影在与此点的“点法式”(法线相垂直的)平面上

在投射的位置线性的插入

1. 计算出线性细分

2. 在三角形三个点上的正切平面上做正交投射

3. 计算重心插入这三个投影

这是他们做出的结果:

Phong Tessellation modifies positions of the subdivided faces so that the resulting surface follows the mesh normals a bit. It’s quite an effective way of making low-poly meshes become more smooth.

Unity’s surface shaders can compute Phong tessellation automatically using tessphong:VariableName compilation directive.

Phong细分修改细分面的位置,使细分面沿着法线突出一点。这是一个让低模变光滑的非常有效的方式。

Unity得surface shaders中能使用tessphong:VariableName编译指令自动计算Phong曲面细分。

Let’s see a comparison between regular shader and one that uses Phong tessellation. Even without any displacement mapping, the surface becomes more round.看看普通shader和Phong细分之后的比较。如果不用之前几个shader的贴图置换,你也能看到模型的表面比以前更圆更光滑了

Phong细分与贴图置换结合(Phong tessellation&Displacement mapping)

Base on Phong tessellation we add Displacement mapping, the result is perfect曲面细分再加上贴图置换(Displacement mapping)就是完美

thanks for read ------------- by wolf Unity Manual Document - 点击打开链接

2. Tamy Boubekeur's Phong tessellation page - 点击打开链接

3. NVIDIA's DirectX Tessellation - 点击打开链接

Unity3D中Enabled、Destroy与Active的区别 Unity3D游戏对象消失三种方法的区别:1、gameObject.active:是否在场景中停用该物体,在你gameObject.active=false中,则你在场景中用find找不到该物体。如果该

unity3d中脚本生命周期(MonoBehaviour lifecycle) 接下来,做出一下讲解:最先执行的方法是Awake,这是生命周期的开始,用于进行激活时的初始化代码,一般可以在这个地方将当前脚本禁用:this.enable=fa

unity飞机大战(2)一些细节问题 对象池补充先说下上一篇对象池的一个问题。用脚本,在一个SpawnPool,添加多个prefab,运行游戏时,只有第一个prefab预加载了规定个数,当用到其他prefab

标签: unity dc

本文链接地址:https://www.jiuchutong.com/biancheng/380171.html 转载请保留说明!

上一篇:unity3d移动平台性能优化专题(3):减少面数(unity3d跨平台)

下一篇:Unity3D中Enabled、Destroy与Active的区别

  • 公司会计日常工作内容
  • 工会经费如何申报?
  • 以前年度费用调减
  • 怎么从其他公司挖人
  • 小微企业季报
  • 员工本地住宿费会计分录
  • 房地产企业预缴土地增值税
  • 外商投资企业采取发包、出租经营
  • 当月报废生产设备一台,原价80万元
  • 外币借款汇兑差额资本化额怎么计算
  • 单位社保没推送
  • 转贴现视为贷款银行如何进行账务处理?
  • 会计人士教你在Excel中如何计算年均增长率
  • 拆迁房视同销售成本可以抵减吗?
  • 个体户报税可以朋友代替吗
  • 增值税纳税表销售额的填写
  • 异地预缴增值税后本地还要交吗
  • 税控设备维修费怎么算
  • 哪种情形
  • 计提印花税会计分录怎么写
  • 修叉车这个工作怎么样
  • windows10如何关闭左下角的搜索
  • 收到加盟费怎么入账
  • 小规模纳税人销售额超过500万
  • 税率抵扣计算公式
  • php中strrev
  • ubuntu 20.04.1
  • 怎么用onekey重装系统
  • 行政单位跨年度收到发票,补付尾款会计分录
  • 自制原始凭证包括哪些凭证
  • javascript局部变量
  • 商品进销差价的作用
  • php递归函数的例子
  • yii框架教程
  • 社会保险费征收机构责令限期缴纳
  • 融资租入固定资产的改建支出
  • 小规模纳税人广告费是什么票据类型的
  • php的implode函数
  • es6对象扩展运算符
  • 大前端技术
  • 被黑客攻击
  • 合并报表少数股东权益抵消分录
  • 公司总人数和上社保人数
  • 个人接受现金捐赠的情况
  • 以公司名义开的诊所算个体工商户吗
  • 织梦前台数据不能存入中文
  • 年度利润表与12月利润表区别
  • php配置文件在哪
  • 税金及附加可以结转吗
  • 出口退税企业更正申报增值税
  • 公司帐户可以转法人私人账户吗
  • 月末假退月初假领
  • 员工的工资属于固定资产吗
  • 没收到发票也可以入账吗
  • 公司增资的法条
  • 其他应收款项
  • 银行存款利息收入要交增值税吗
  • 专票遗失没有认证能用吗
  • 公司发放给员工的福利又要回
  • 哪些业务需要计提国别风险准备金
  • 从增值税抵扣进什么科目
  • 会计里面权益是什么
  • mysql数据库优化总结
  • 连接mysql数据出错1045
  • Win10预览版拆弹
  • CentOS里/etc/sysconfig/clock内容解读
  • solaris安装软件包
  • 重装win7系统后桌面没东西
  • 越狱免电脑
  • make_sock: could not bind to address 0.0.0.0:443
  • ssh客户端软件
  • win8手提电脑怎么关闭触摸板
  • js call.call
  • js message事件
  • 如何用jquery
  • 无线adb调试开关下载
  • 关于echo的名字
  • javascript test
  • 广东税务局一般几点上班
  • 山西税务服务热线号码
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设