当前位置: 首页 > news >正文

社团网站设计网页咸宁网页设计

社团网站设计网页,咸宁网页设计,网站建设公司推广网站品牌运营,wordpress5.2怎么添加友情链接关于本系列 这是Unity3D Shader入门指南系列的第二篇#xff0c;本系列面向的对象是新接触Shader开发的Unity3D使用者#xff0c;因为我本身自己也是Shader初学者#xff0c;因此可能会存在错误或者疏漏#xff0c;如果您在Shader开发上有所心得#xff0c;很欢迎并恳请您… 关于本系列 这是Unity3D Shader入门指南系列的第二篇本系列面向的对象是新接触Shader开发的Unity3D使用者因为我本身自己也是Shader初学者因此可能会存在错误或者疏漏如果您在Shader开发上有所心得很欢迎并恳请您指出文中纰漏我会尽快改正。在之前的开篇中介绍了一些Shader的基本知识包括ShaderLab的基本结构和语法以及简单逐句地讲解了一个基本的shader。在具有这些基础知识后阅读简单的shader应该不会有太大问题在继续教程之前简单阅读一下Unity的Surface Shader Example以检验您是否掌握了上一节的内容。如果您对阅读大部分示例Shader并没有太大问题可以正确地指出Shader的结构声明和使用的话就说明您已经准备好继续阅读本节的内容了。 法线贴图(Normal Mapping) 法线贴图是凸凹贴图(Bump mapping)的一种常见应用简单说就是在不增加模型多边形数量的前提下通过渲染暗部和亮部的不同颜色深度来为原来的贴图和模型增加视觉细节和真实效果。简单原理是在普通的贴图的基础上再另外提供一张对应原来贴图的可以表示渲染浓淡的贴图。通过将这张附加的表示表面凸凹的贴图的因素于实际的原贴图进行运算后可以得到新的细节更加丰富富有立体感的渲染效果。在本节中我们将首先实现一个法线贴图的Shader然后对Unity Shader的光照模型进行一些讨论并实现一个自定义的光照模型。最后再通过更改shader模拟一个石头上的积雪效果并对模型顶点进行一些修改使积雪效果看起来比较真实。在本节结束的时候我们就会有一个比较强大的可以满足一些真实开发工作时可用的shader了而且更重要的是我们将会掌握它是如何被创造出来的。 关于法线贴图的效果图可以对比看看下面。模型面数为500左侧只使用了简单的Diffuse着色右侧使用了法线贴图。比较两张图片不难发现使用了法线贴图的石头在暗部和亮部都有着更好的表现。整体来说凸凹感比Diffuse的结果增强许多石头看起来更真实也更具有质感。 本节中需要用到的上面的素材可以在这里下载其中包括上面的石块的模型一张贴图以及对应的法线贴图。将下载的package导入到工程中并新建一个material使用简单的Diffuse的Shader比如上一节我们实现的再加上一个合适的平行光光源就可以得到我们左图的效果。另外本节以及以后都会涉及到一些Unity内建的Shader的内容比如一些标准常用函数和常量定义等相关内容可以在Unity的内建Shader中找到内建Shader可以在Unity下载页面的版本右侧找到。 接下来我们实现法线贴图。在实现之前我们先简单地稍微多了解一些法线贴图的基本知识。大多数法线图一般都和下面的图类似是一张以蓝紫色为主的图。这张法线图其实是一张RGB贴图其中红绿蓝三个通道分别表示由高度图转换而来的该点的法线指向Nx、Ny、Nz。在其中绝大部分点的法线都指向z方向因此图更偏向于蓝色。在shader进行处理时我们将光照与该点的法线值进行点积后即可得到在该光线下应有的明暗特性再将其应用到原图上即可反应在一定光照环境下物体的凹凸关系了。关于法向贴图的更多信息可以参考wiki上的相关条目。 回到正题我们现在考虑的主要是Shader入门而不是图像学的原理。再上一节我们写的Shader的基础上稍微做一些修改就可以得到适应并完成法线贴图渲染的新Shader。新加入的部分进行了编号并在之后进行说明。 Shader Custom/Normal Mapping { Properties {_MainTex (Base (RGB), 2D) white {}//1 _Bump (Bump, 2D) bump {} } SubShader { Tags { RenderTypeOpaque } LOD 200 CGPROGRAM #pragma surface surf Lambert sampler2D _MainTex; //2 sampler2D _Bump; struct Input { float2 uv_MainTex; //3 float2 uv_Bump; }; void surf (Input IN, inout SurfaceOutput o) { half4 c tex2D (_MainTex, IN.uv_MainTex); //4 o.Normal UnpackNormal(tex2D(_Bump, IN.uv_Bump); o.Albedo c.rgb; o.Alpha c.a; } ENDCG } FallBack Diffuse } 声明并加入一个显示名称为Bump的贴图用于放置法线图为了能够在CG程序中使用这张贴图必须加入一个sample希望你还记得获取Bump的uv信息作为输入从法线图中提取法线信息并将其赋予相应点的输出的Normal属性。UnpackNormal是定义在UnityCG.cginc文件中的方法这个文件中包含了一系列常用的CG变量以及方法。UnpackNormal接受一个fixed4的输入并将其转换为所对应的法线值fixed3。在解包得到这个值之后将其赋给输出的Normal就可以参与到光线运算中完成接下来的渲染工作了。现在保存并且编译这个Shader创建新的material并使用这个shader将石头的材质贴图和法线图分别拖放到Base和Bump里再将其应用到石头模型上应该就可以看到右侧图的效果了。 光照模型 在我们之前的看到的Shader中其实也就上一节的基本diffuse和这里的normal mapping都只使用了Lambert的光照模型#pragma surface surf Lambert这是一个很经典的漫反射模型光强与入射光的方向和反射点处表面法向夹角的余弦成正比。关于Lambert和漫反射的一些详细的计算和推论可以参看wikiLambert漫反射或者其他地方的介绍。一句话的简单解释就是一个点的反射光强是和该点的法线向量和入射光向量和强度和夹角有关系的其结果就是这两个向量的点积。既然已经知道了光照计算的原理我们先来看看如何实现一个自己的光照模型吧。 在刚才的Shader上进行如下修改。 首先将原来的#pragma行改为这样#pragma surface surf CustomDiffuse然后在SubShader块中添加如下代码inline float4 LightingCustomDiffuse (SurfaceOutput s, fixed3 lightDir, fixed atten) { float difLight max(0, dot (s.Normal, lightDir));float4 col;col.rgb s.Albedo * _LightColor0.rgb * (difLight * atten * 2);col.a s.Alpha;return col; } 最后保存回到Unity。Shader将编译如果一切正常你将不会看到新的shader和之前的在材质表现上有任何不同。但是事实上我们现在的shader已经与Unity内建的diffuse光照模型撇清了关系而在使用我们自己设定的光照模型了。喵的这些代码都干了些什么相信你一定会有这样的疑惑...没问题没有疑惑的话那就不叫初学了还是一行行讲来。首先正像我们上一篇所说#pragma语句在这里声明了接下来的Shader的类型计算调用的方法名以及指定光照模型。在之前我们一直指定Lambert为光照模型而现在我们将其换为了CustomDiffuse。 接下来添加的代码是计算光照的实现。shader中对于方法的名称有着比较严格的约定想要创建一个光照模型首先要做的是按照规则声明一个光照计算的函数名字即LightingYour Chosen Name。对于我们的光照模型CustomDiffuse其计算函数的名称自然就是LightingCustomDiffuse了。光照模型的计算是在surf方法的表面颜色之后根据输入的光照条件来对原来的颜色在这种光照下的表现进行计算最后输出新的颜色值给渲染单元完成在屏幕的绘制。 也许你已经猜到了我们之前用的Lambert光照模型是不是也有一个名字叫LightingLambert的光照计算函数呢Bingo。在Unity的内建Shader中有一个Lighting.cginc文件里面就包含了LightingLambert的实现。也许你也注意到了我们所实现的LightingCustomDiffuse的内容现在和Unity内建中的LightingLambert是完全一样的这也就是使用新的shader的原来视觉上没有区别的原因因为实现确实是完全一样的。 首先来看输入量SurfaceOutput s这个就是经过表面计算函数surf处理后的输出我们讲对其上的点根据光线进行处理fixed3 lightDir是光线的方向fixed atten表示光衰减的系数。在计算光照的代码中我们先将输入的s的法线值在Normal mapping中的话这个值已经是法线图中的对应量了和输入光线进行点积dot函数是CG中内置的数学函数希望你还记得可以参考这里。点积的结果在-1至1之间这个值越大表示法线与光线间夹角越小这个点也就应该越亮。之后使用max来将这个系数结果限制在0到1之间是为了避免负数情况的存在而导致最终计算的颜色变为负数输出一团黑一般来说这是我们不愿意看到的。接下来我们将surf输出的颜色与光线的颜色_LightColor0.rgb由Unity根据场景中的光源得到的它在Lighting.cginc中有声明进行乘积然后再与刚才计算的光强系数和输入的衰减系数相乘最后得到在这个光线下的颜色输出关于difLight * atten * 2中为什么有个乘2这是一个历史遗留问题主要是为了进行一些光强补偿可以参见这里的讨论。 在了解了基本实现方式之后我们可以看看做一些修改玩玩儿。最简单的比如将这个Lambert模型改亮一些比如换成Half Lambert模型。Half Lambert是由Valve创造的可以使物体在低光线条件下增亮的技术最早被用于半条命Half Life中以避免在低光下物体的走形。简单说就是把光强系数先取一半然后在加0.5代码如下 inline float4 LightingCustomDiffuse (SurfaceOutput s, fixed3 lightDir, fixed atten) { float difLight dot (s.Normal, lightDir);float hLambert difLight * 0.5 0.5; float4 col; col.rgb s.Albedo * _LightColor0.rgb * (hLambert * atten * 2); col.a s.Alpha; return col; } 这样一来原来光强0的点现在对应的值变为了0.5而原来是1的地方现在将保持为1。也就是说模型贴图的暗部被增强变亮了而亮部基本保持和原来一样防止过曝。使用Half Lambert前后的效果图如下注意最右侧石头下方的阴影处细节更加明显了而这一切都只是视觉效果的改变不涉及任何贴图和模型的变化。 表面贴图的追加效果 OK对于光线和自定义光照模型的讨论暂时到此为止因为如果展开的话这将会一个庞大的图形学和经典光学的话题了。我们回到Shader并且一起实现一些激动人心的效果吧。比如在你的游戏场景中有一幕是雪地场景而你希望做一些石头上白雪皑皑的覆盖效果应该怎么办呢难道让你可爱的3D设计师再去出一套覆雪的贴图然后使用新的贴图当然不不是不能而是不该。因为新的贴图不仅会增大项目的资源包体积更会增大之后修改和维护的难度想想要是有好多石头需要实现同样的覆雪效果或者是要随着游戏时间堆积的雪逐渐变多的话你应该怎么办难道让设计师再把所有的石头贴图都盖上雪然后再按照雪的厚度出5套不同的贴图么相信我他们会疯的。 于是我们考虑用Shader来完成这件工作吧先考虑下我们需要什么积雪效果的话我们需要积雪等级用来表示积雪量雪的颜色以及积雪的方向。基本思路和实现自定义光照模型类似通过计算原图的点在世界坐标中的法线方向与积雪方向的点积如果大于设定的积雪等级的阈值的话则表示这个方向与积雪方向是一致的其上是可以积雪的显示雪的颜色否则使用原贴图的颜色。废话不再多说上代码在上面的Shader的基础上更改Properties里的内容为 Properties { _MainTex (Base (RGB), 2D) white {}_Bump (Bump, 2D) bump {} _Snow (Snow Level, Range(0,1) ) 0 _SnowColor (Snow Color, Color) (1.0,1.0,1.0,1.0) _SnowDirection (Snow Direction, Vector) (0,1,0) } 没有太多值得说的唯一要提一下的是_SnowDirection设定的默认值为(0,1,0)这表示我们希望雪是垂直落下的。对应地在CG程序中对这些变量进行声明 sampler2D _MainTex; sampler2D _Bump; float _Snow; float4 _SnowColor; float4 _SnowDirection; 接下来改变Input的内容 struct Input { float2 uv_MainTex;float2 uv_Bump;float3 worldNormal; INTERNAL_DATA };相对于上面的Shader输入来说加入了一个float3 worldNormal; INTERNAL_DATA如果SurfaceOutput中设定了Normal值的话通过worldNormal可以获取当前点在世界中的法线值。详细的解说可以参见Unity的Shader文档。接下来可以改变surf函数实装积雪效果了。 void surf (Input IN, inout SurfaceOutput o) { half4 c tex2D (_MainTex, IN.uv_MainTex);o.Normal UnpackNormal(tex2D(_Bump, IN.uv_Bump));if (dot(WorldNormalVector(IN, o.Normal), _SnowDirection.xyz) lerp(1,-1,_Snow)) {o.Albedo _SnowColor.rgb;} else { o.Albedo c.rgb; } o.Alpha c.a; } 和上面相比加入了一个if…else…的判断。首先看这个条件的不等式的左侧我们对雪的方向和和输入点的世界法线方向进行点积。WorldNormalVector通过输入的点及这个点的法线值来计算它在世界坐标中的方向右侧的lerp函数相信只要对插值有概念的同学都不难理解当Snow取最小值0时这个函数将返回1而Snow取最大值时返回-1。这样我们就可以通过设定Snow的值来控制积雪的阈值要是积雪等级Snow是0时不等式左侧不可能大于右侧因此完全没有积雪相反要是_Snow取最大值1时由于左侧必定大于-1所以全模型积雪。而随着取中间值的变化积雪的情况便会有所不同。 应用这个Shader并且适当地调节一下积雪等级和颜色可以得到如下右边的效果。 更改顶点模型 到现在位置我们还仅指是在原贴图上进行操作不管是用法线图使模型看起来凸凹有致还是加上积雪所有的计算和颜色的输出都只是“障眼法”并没有对模型有任何实质的改动。但是对于积雪效果来说实际上积雪是附加到石头上面而不应当简单替换掉原来的颜色。但是具体实施起来最简单的办法还是直接替换颜色但是我们可以稍微变更一下模型使原来的模型在积雪的方向稍微变大一些这样来达到一种雪是附加到石头上的效果。 我们继续修改之前的Shader首先我们需要告诉surface shadow我们要改变模型的顶点。首先将#param行改为 #pragma surface surf CustomDiffuse vertex:vert 这告诉Shader我们想要改变模型顶点并且我们会写一个叫做vert的函数来改变顶点。接下来我们再添加一个参数在Properties中声明一个_SnowDepth变量表示积雪的厚度当然我们也需要在CG段中进行声明 //In Properties{…} _SnowDepth (Snow Depth, Range(0,0.3)) 0.1 //In CG declare float _SnowDepth; 接下来实现vert方法和之前积雪的运算其实比较类似判断点积大小来决定是否需要扩大模型以及确定模型扩大的方向。在CG段中加入以下vert方法 void vert (inout appdata_full v) { float4 sn mul(transpose(_Object2World) , _SnowDirection);if(dot(v.normal, sn.xyz) lerp(1,-1, (_Snow * 2) / 3)) { v.vertex.xyz (sn.xyz v.normal) * _SnowDepth * _Snow; } } 和surf的原理差不多系统会输入一个当前的顶点的值我们根据需要计算并填上新的值作为返回即可。上面第一行中使用transpose方法输出原矩阵的转置矩阵在这里_Object2World是Unity ShaderLab的内建值它表示将当前模型转换到世界坐标中的矩阵将其与积雪方向做矩阵乘积得到积雪方向在物体的世界空间中的投影把积雪方向转换到世界坐标中。之后我们计算了这个世界坐标中实际的积雪方向和当前点的法线值的点积并将结果与使用积雪等级的2/3进行比较lerp后的阈值比较。这样当前点如果和积雪方向一致并且积雪较为完整的话将改变该点的模型顶点高度。 加入模型更改前后的效果对比如下图加入模型调整的右图表现要更为丰满真实。 这节就到这里吧。本节中实现的Shader可以在这里找到完整版本进行参考希望大家周末愉快 原文http://onevcat.com/2013/08/shader-tutorial-2/ 转载于:https://www.cnblogs.com/cm186man/p/4087594.html
http://www.zqtcl.cn/news/990547/

相关文章:

  • dedecms可以做什么网站织梦做的网站在手机上显示
  • 温州建设小学的网站吐鲁番seo快速排名
  • 翼城网站建设重庆平台网站建设多少钱
  • 短视频网站的动画是怎么做的外贸一般用什么平台
  • 北京建站开发企业网站建设平台
  • 建设网站建设什么征琴他达拉非
  • 详情页制作网站广州建设工程招标信息网
  • wordpress 响应速度慢长沙seo排名扣费
  • 网站首页二级下拉框怎么做酒店网站建设方案
  • 公众号流量投放网络优化工程师有前途吗
  • 电影网站app怎么做的网站关键词是什么
  • 成都做网站建设公司建设网站总结报告
  • 个人网站要备案嘛免费响应式模板网站
  • 淘宝网站内站建设免费个人网站怎么建立
  • 网站运营经验分享ppt沉默是金粤语谐音歌词
  • 建设部网站人员查询wordpress中文 手机版
  • 大港油田建设网站电子商务公司取名字参考大全
  • 贵阳网站建设多点互动wordpress分页出现404
  • wap微信网站模板网站如何做链接
  • 泉州专业网站开发公司怎么免费做公司网页
  • 嵌入式软件开发前景怎么样百度官方优化指南
  • 网站访问速度优化工具网页设计模板图片大全
  • 哪里有手机网站制作公司网页设计与制作心得体会800字
  • 湖南建设厅网站首页简述网站建设的基本思路
  • 蚌埠公司做网站网站开发月薪
  • 怎么更换网站logo推荐几个没封的正能量网站
  • 开网站的宣传图片怎么做php网站建设面试
  • 哪些网站可以下载视频网站建设评价量规
  • 惠州市建设局网站网站模块设计怎么做
  • 群晖可不可以做网站用如何查询商标是否已经被注册