ShaderLab学习笔记

来源:互联网 发布:单片机无线抢答器 编辑:程序博客网 时间:2024/06/11 22:27

</pre>inline fixed4 Lighting (SurfaceOutput  s Surf数据结构,fixed3 lightDir,half3 viewDir,fixed atten)<p></p><p>{</p><p>}</p><p></p><p></p><p>计算高光</p><p>half3 halfVec = normalize(lightDir + viewDir);//阳光面向照相机方向</p><p>float NdotH = max(0,dot(s.Normal,halfVec));//高光值</p><p><img src="http://img.blog.csdn.net/20150807214624801?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p><p></p><p></p><p></p><p></p><p>根据纹理颜色设置透明度。</p><p><img src="http://img.blog.csdn.net/20150810224404831?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p><p></p><pre name="code" class="plain">Properties:_TransVal("Transparency Value",Range(0,1))=0.5#pragma surface surf Lambert alpha//有透明度surf:o.Alpha = c.r * _TransVal;
</pre><p></p><p>透明裁剪器:</p><p></p><pre name="code" class="plain">_Cutoff("Cutoff Value",Range(0,1)) = 0.5<span style="white-space:pre"></span>//低于这个灰度的值变得完全透明
#pragma surface surf Lambert alphatest:_Cutoff<span style="white-space:pre"></span>//低于这个灰度的值变得完全透明 手机使用这个性能不如直接alpha
o.Alpha = c.r;<span style="white-space:pre"></span>//Alpha(0~1)低于_Cutoff值,将会完全透明。没有透明度




通过渲染队列进行深度排序:

Tags { "Queue"="Geometry-19" }ZWrite off //告诉unity我们要重写物体的渲染深度顺序
</pre>渲染队列:Background背景               1000<p></p><p><span style="white-space:pre"></span>Geometry几何体                  2000</p><p><span style="white-space:pre"></span>AlphaTest透明度测试<span style="white-space:pre"></span>   2450</p><p><span style="white-space:pre"></span>Transparent透明<span style="white-space:pre"></span>  3000</p><p><span style="white-space:pre"></span>Overlay覆盖<span style="white-space:pre"> </span> 4000</p><p></p><p></p><p></p><p>vertex:vert</p><p><pre name="code" class="plain">void vert(inout appdata_full v,out Input o)   //appdata_full是内置结构体。用于存储顶点结构信息         {            UNITY_INITIALIZE_OUTPUT(Input,o);//将给定类型的名称变量初始化为零(如果你是使用DX11才需要加这个)        o.vertColor = v.color;    //我们将顶点信息传入Input结构体。从而达到提取顶点颜色信息的目的        }



轻型着色器:

#pragma surface surf SimpleLambert exclude_path:prepass nolightmap noforwardadd halfasview 

exclude_pass:prepass 这样着色器就不会接受任何来自延迟渲染的自定义光照了

exclude_pass:prepass排除了延迟渲染的pass(通道)。如果你创建了一个使用延迟渲染器的prepass的光照函数,着色器将不会使用这个特定的函数,而是寻找默认的光照函数比如之前创建的一些光照函数。

nolightmap在这个着色器上禁用光照贴图。(使着色器变小)

noforwardadd简单的说就是指接受一个光照的法线渲染.只对一个方向光进行逐像素纹理运算。其他所有灯光都被强行被转换成顶点的光源。并且不会在surf()函数中进行任何逐像素操作。

halfasview声明不使用普通光照函数中的viewDir主参数。取而代之的是我们直接使用半角向量(half vector)作为视线方向并用于我们的高光计算。因为半角向量是基于逐顶点的计算。这种计算不准确,但是在移动平台上刚刚好而且使着色器更加优化。

inline fixed4 LightingMobileBlinnPhong(SurfaceOutput s,fixed3 lightDir,fixed3 halfDir,fixed atten)---halfasview

Important像素光源 Not Important顶点光源



struct SurfaceOutput {    half3 Albedo;//反射率    half3 Normal;//法线    half3 Emission;//自发光,用于增强物体自身的亮度,使之看起来好像可以自己发光    half Specular;//镜面    half Gloss;//光泽    half Alpha;//透明};


优化变量类型:

  • float:高精度浮点值,通常是32位,也是三者中最慢的一个。它对应的还有float2,float3和float4。

  • half:中精度浮点值。通常是16位,范围是-60000至+60000,它适合存储UV坐标,颜色值等,比float类型快很多。它对应的还有half2,half3,和half4。

  • fixed:低精度浮点值。通常是11位,范围是-2.0至+2.0,精度为1/256。这是三者中最小的一个,可以用于光照计算颜色等。它对应的值有fixed2,fixed3和fixed4。

2D简单遮罩

Shader "Custom/MaskShader" {Properties {_MainTex ("Base (RGB)", 2D) = "white" {}_Mask("Culling Mask",2D)="white"{}_Cutoff("Alpha cutoff",Range(0,1))=0.1}SubShader {Tags { "Queue"="Transparent" }Lighting Off//ZWrite Off//关掉Z轴?最后输出Blend SrcAlpha OneMinusSrcAlpha//AlphaTest GEqual [_Cutoff]Pass{SetTexture [_Mask]{combine texture}SetTexture [_MainTex]{combine texture,texture-previous}}}}


0 0
原创粉丝点击