Unity3D技术之纹理着色器基础详解_第1页
Unity3D技术之纹理着色器基础详解_第2页
Unity3D技术之纹理着色器基础详解_第3页
Unity3D技术之纹理着色器基础详解_第4页
Unity3D技术之纹理着色器基础详解_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Unity3D技术之纹理着色器基础详解今天要说的是unity3D中shader相关的一些知识。不会做非常细致的讲解(东西 实在太多!-),但是看完之后会知道shader是怎么用的。一些术语在shader编程中,有一些术语,有时候不明白的话容易被整懵圈,所以这里就简 单提一下。ShadingShading最开始指的在素描中给物体画明暗调子,在图形学中,其实就是给Mesh上色(Mesh就是一堆三角面片,包含顶点左边,法线坐标,uv坐标之类的),wiki中说的是根据物体相对于光线的角度及其距离光源距离改变物体颜色生成photorealistic 效果的过程。我们所编写的处理shading的程序就叫做

2、shader,中文叫着色器,程序的输入是颜色,纹理,坐标等等,输出的是mesh网格的最终的颜色。光照模型光照模型主要包括两个部分,一部分是光源的定义,另一部分是mesh表面的光照计算。光源根据现实中的光源可以抽象成点光源,方向光源,聚光灯。mesh表面的光照计算主要计算三个部分,环境光(Ambient light ),漫反射光(Diffuse light ),全反射光(Specular light )。文章出处 【狗刨学习网】。Lambert光照模型此模型属于经验模型,主要用来简单模拟粗糙物体表面的光照现象。此模型假设物体表面为理想漫反射体(也就是只产生漫反射现象,也成为Lambert反射体)

3、,同时,场景中存在两种光,一种为环境光,一种为方向光,然后我们分别计算 这两种光照射到粗糙物体表面所产生的光照现象,最后再将两个结果相加,得出反射后的 光强值。首先是计算环境光的公式:I_ambdiff = K_d * I_a;其中,K_d为粗糙物体表面材质对光的反射系数,这个系数由程序编写者在宿主程 序中给出,I_a为环境光的光强,也就是环境光的颜色数值,一般是一个float3 型的变量。然后是计算方向光的公式:I_ldiff = K_d * I_l * cosa;由向量的点积公式可得:cosa = N L,所以计算方向光的公式就变为:I_ldiff = K_d * I_l * (N L);

4、综上,得出漫反射后的光强为:I_diff = K_d * I_a + K_d * I_l * (NL);Build-in Shaderunity3d 自带的 shader。MeshFilter 和 MeshRenderer 还有 Skinned Mesh Renderer当将一个静态的 mesh网格添加到场景中的时候,unity会自动为这个 GameObject添加MeshFilter 和MeshRenderer组件,MeshFilter 用来保存网格过滤器用于从你的资 源中获取网格信息(Mesh)并将其传递到用于将其渲染到屏幕的网格渲染器当中。MeshRenderer从MeshFilter

5、获得几何形状,并且根据物体的Transform组件的定义位置进行渲染。当导入有蒙皮的网格时,Skinned Mesh Renderer 会自动添加到导入的网格。材质和shader的关系在3dsmax中要给模型加贴图都要新建一个材质球,Shader (着色器)实际上就是一小段程序,它负责将输入的 Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作 用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色 等,加上对应的 Shader,以及对Shader的特定的参数设置,将这些内容( Shader及输入 参数)打包存储在一起,得到的就是一个Material (材质)。之

6、后,我们便可以将材质赋予合适的renderer (渲染器)来进行渲染(输出)了。实战开始话不多说,打开Unity。Laveii0 ntpvdar * Lightmappinq:»' Tiysut»mi白flal' t靠 / CkivCidbstarts -=LJijrer '口有亦E,rrfvlirtOpinJTF3骨雷f中El 0QSX ZTD¥0Z 0X 1T12 1. Sh litn-fid Mitch Re did £-!-<: I*1 dHfhddowt*c r i a 1 sifUlf Ught Pr蛆,Quat

7、tji-AmirUpdate WhenBBkifeCiibFont1 BpOl (Ttiftflwm)oCentfrr:x司* m rD.C334BD5f Z “立叫M24FCzbfirVi:M O.17flB7>£il fZ 0.12ti23&AV魅% “如D;的hl Ed* Add Coffiponenft首先将准备好的模型拖到场景中。拖进来的模型都会自带一个 Skinned Mesh Renderer ,用来显示带动画的模型,并 且unity 会自动创建一个材质,material_0,直接用的自带的 diffuse shader 来渲染,然后赋到这个rendere

8、r上面。接下来我们要自己创建 Material和Shader,点击Project面 板的create,创建一个 Shader和Material ,名字都叫Test0。(程序猿强迫症-索引一定要从0开始-)Test0 的解释打开创建好的Test0.shader1. Shader "Custom/Test0” 2.2. Properties 4.3. _MainTex ("Base (RGB)", 2D) = "white" 6.4. 8.5. SubShader 10.6. Tags "RenderType"="Op

9、aque" 12.7. LOD 20014.8. CGPROGRAM16.9. #pragma surface surf Lambert18.10. sampler2D _MainTex;20.11. struct Input 22.12. float2 uv_MainTex;24.25. 26.26. void surf (Input IN, inout SurfaceOutput o) (28.27. half4 c = tex2D (_MainTex, IN.uv_MainTex);30.28. o.Albedo = c.rgb;32.29. o.Alpha = c.a;34.

10、30. 36.31. ENDCG38.32. 40.33. FallBack "Diffuse"42.34. 44.在u3d中自己定义了一种 shader格式,叫做shaderlab ,有很多特性,感觉就是 最大限度地为跨平台服务。首先看这个shader的整体结构,这个 Test0的shader中,首先定义属性,然后定义了一个SubShader(可以定义多个),最后是FallBack。一行行来解释。第一行,shader的名字,定义成 Custom/Test0之后,如果 shader成功编译,就 可以在unity的Shader中找到了material_OShader Cust

11、em.-Te sttBg (PGB)Bumped DiffuseBumped SpecularDecalNonefTe:<ture)DiffuseSeFsctDiffuse DetailParallax DiffuseParallax SpecularSpecularCustomTestOFXGUIMobile2-4行,定义属性,在这里是定义了一个2D的纹理。每一条属性的定义的语法是这样的:_Name("Display Name", type) = defaultValue(optionssubShader里面定义的是 Shader的主体。第6行,标签,opaque告

12、诉了系统应该在渲染非透明物体时调用我们。Unity定义了一些列这样的渲染过程,与 RenderType是Opaque相对应的显而易见的是 "RenderType" ="Transparent",表示渲染含有透明效果的物体时调用。第7行,LOD,它是Level of Detail的缩写,在这里例子里我们指定了其为200(其实这是Unity的内建Diffuse着色器的设定值)。这个数值决定了我们能用什么样的 Shader。在Unity的Quality Settings中我们可以设定允许的最大LOD当设定的LOD小于SubShader所指定的LOD时,这个 S

13、ubShader将不可用。Unity内建Shader定义了一组 LOD的数值,我们在实现自己的Shader的时候可以将其作为参考来设定自己的LOg值,这样在之后调整根据设备图形性能来调整画质时可以进行比较精确的控制。9-23行,一段CG的代码。10行,它声明了我们要写一个表面Shader,并指定了光照模型。它的写法是这样#pragma surface surfaceFunction lightModel optionalparamssurface -声明的是一个表面着色器surfaceFunction -着色器代码的方法的名字、lightModel -使用的光照模型。我们的代码中,声明了一个表

14、面着色器,实际的代码在surf函数中(在下面能找到该函数),使用 Lambert (也就是普通的diffuse )作为光照模型。12行,声明2D纹理_MainTex.对于这段CG程序,要想访问在 Properties 中所定 义的变量的话,必须使用和之前变量相同的名字进行声明。于是其实sampler2D _MainTex;做的事情就是再次声明并链接了_MainTex,使得接下来的CG程序能够使用这个变量。14-16行,定义一个结构体,可以把所需要参与计算的数据都放到这个Input结构中,传入surf函数使用,这里只放了 uv坐标。在CG程序中,有这样的约定,在一个贴图 变量(在我们例子中是 _

15、MainTex)之前加上uv两个字母,就代表提取它的uv值(其实就是两个代表贴图上点的二外坐标)。18-22行,表面着色器的着色函数。CG规定了声明为表面着色器的方法(就是我们这里的surf )的参数类型和名字,因此我们没有权利决定surf的输入输出参数的类型,只能按照规定写。这个规定就是第一个参数是一个Input结构,第二个参数是一个inout的SurfaceOutput结构。这里用到了一个 tex2d函数,这是 CG程序中用来在一张贴图中对 一个点进行采样的方法,返回一个float4。这里对_MainTex在输入点上进行了采样,并将其颜色的rbg值赋予了输出的像素颜色,将a值赋予透明度。于是,着色器就明白了应当怎样工作:即找到贴图上对应的uv点,直接使用颜色信息来进行着色

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论