Unity3D Shader官方教程翻译(三)


1、Shader语法:Pass

1个Pass块可以使一个几何物体被一次渲染。

Pass { [Name and Tags] [RenderSetup] [TextureSetup] }


最基础的pass命令包含有1个可选的渲染设置命令列表,及1个可选的可用纹理列表。



Name and tags

一个Pass 可以定义它的名字和任意数量的标签-name/value 字符串 将Pass的含义告诉给渲染引擎。

Render Setup 渲染设置

Pass设置了一系列的显卡状态,比如说alpha混合是否开启,是否允许雾化等等。 这些命令有:

Material { Material Block } 材质


定义了1个顶点光照管道使用的材质。



Lighting On | Off 开启关闭灯光

关闭或开启顶点光照。



Cull Back | Front | Off  裁剪背面|前面|关闭


设置多边形的裁剪模式。




ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always)


设置深度测试模式



OpenGL 深度其实就是该象素点在3d世界中距离摄象机的距离,深度缓存中存储着每个象素点(绘制在屏幕上的)的深度值!深度测试决定了是否绘制较远的象素点(或较近的象素点),通常选用较近的,而较远优先能实现透视的效果!



ZWrite On | Off


设置深度写模式类型




Fog { Fog Block }


设置雾化参数




AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue


开启Alpha测试




Blend SourceBlendMode DestBlendMode


设置Alpha混合模式



Color Color value


设置颜色,当顶点光照关闭时候有效。




ColorMask RGB | A | 0 | any combination of R, G, B, A


设置颜色遮罩模式。将ColorMask设置为0表示关闭所有渲染的颜色管道。




Offset OffsetFactor , OffsetUnits


设置深度偏移。提示:这个命令仅接受Unity3 3D的常数参数(不是Shader的参数)。

用于为图形设置深度的偏移

这个函数一般用于当两图形刚上处于同坐标或两个面在同一坐标重叠时。可以通过这个函数让其中一个图形或面的坐标自动偏移。 

在许多实现方法中为了节省重绘深度图所花费的时间,可以只对场景中的一部分物体进行渲染来生成阴影图。另外,为了解决当前深度值与下一步绘制的表面深度太接近产生的深度冲突问题(Z-fighting),也可能在阴影图渲染过程中对物体的照明深度添加一个偏移。实现这种效果的另外一种可选方法是裁剪掉前面的物体,仅对后面的物体进行渲染生成阴影图。



SeparateSpecular On | Off


关闭或打开顶点照明单独的镜面反射光的颜色。



ColorMaterial AmbientAndDiffuse | Emission 环境和漫反射|放射


计算顶点照明时使用的每个顶点颜色



Texture Setup 纹理设置


当渲染状态设置以后,你可以用SetTexture命令指定这些纹理和他们的结合方式。



SetTexture texture property { [Combine options] } 设置纹理


纹理设置固定功能的多纹理管线,如果使用定制的片断着色器将被忽略。



Per-pixel Lighting 逐像素光照


逐像素光照管道的工作依赖于渲染对象在多个pass中。Unity3D一旦获得环境光和任何顶点的光照就开始渲染物体。然后,它在一个单独添加的pass中影响渲染的物体每1个光照的像素。



Per-vertex Lighting 逐顶点光照


逐顶点光照是Direct3d/OpenGl的标准光照模式,它的计算依赖于每一个顶点。打开光照后才能启动逐顶点光照。光照受Materialblock, ColorMaterial 和 SeparateSpecular命令影响。 



2、Shader语法:Pass的Color, Material, Lighting

材质和照明参数是用来控制内置的顶点光照。顶点光照是Direct3D/OpenGL的标准照明模型,它计算每一个顶点。Lighting on命令打开它。光照受Material block,ColorMaterial和SeparateSpecular命令影响


逐像素光照 通常是实现自定义的顶点/片断程序,它不使用顶点照明。这篇文章中描述的任何命令都不会用来操作逐像素光照,你可以通过自己定义的顶点和片段编程来实现这个效果。



unity3d 要支持中文 xml文件编码_ci


当渲染任何几何图形时候,顶点颜色和光照是第1个被计算的效果。在纹理应用之前,它首先操作顶点层级,然后计算基础颜色。



Shader "VertexLit" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {
        Pass {
            Material {
                Diffuse [_Color]
                Ambient [_Color]
                Shininess [_Shininess]
                Specular [_SpecColor]
                Emission [_Emission]
            }
            Lighting On
            SeparateSpecular On
            SetTexture [_MainTex] {
                Combine texture * primary DOUBLE, texture * primary
            }
        }
    }
}



3、Shader语法:Pass的Culling & Depth Testing


unity3d 要支持中文 xml文件编码_ci_02



面剔除是1个可选项,不被观众观察到的多边形面它不会去渲染。所有的多边形都包含1个正面和背面。剔除常用于剔除那些远离你的面,比如说背面通常情况下你是看不见的。所以通常情况下是剔除背面,但是你也可以选择剔除正面。


另外一个使物体渲染看起来正常的是深度测试。深度测试确定在场景中只绘制物体离观察者最近的表面。


Cull Back | Front | Off  剔除 面 正面 关闭 

控制哪边的面被剔除(不被绘制) 

不去渲染观察者看不到的背面。

不去渲染观察者能看的到得正面。常用于由内而外显示物体。

关闭剔除,所有面都可见,用于一些特殊效果。

 

ZWrite On | Off 

控制是否将物体的像素写入深度缓冲中(默认的是开启)。如果你想绘制某个固定物体,这里无用请不要看了。如果你想绘制半透明效果,请关闭ZWrite,详情请见后面。 

  

ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always 

控制深度测试如何进行。默认是LEqual(依据现有对象的距离绘制对象,隐藏小于设置的值的对象)。 

  

Offset Factor , Units  深度偏移 

允许你指定深度偏移的2个参数。factor和units, Factor 设置Z的最大斜率,关于多边形的X或Y。 units设置最小可分辨深度缓冲的值。当2个多边形在同一深度时候,这个可以强制设定一个多边形比另外1个多边形优先绘制。举例 ,offset 0,-1可以强制多边形更接近摄像头(忽略多边形的斜率)。offset -1,-1 在掠射角时候,将更加使多边形接近摄像头。



Shader "Show Insides" {
    SubShader {
        Pass {
            Material {
                Diffuse (1,1,1,1)
            }
            Lighting On
            Cull Front
        }
    }
}
Shader "Reveal Backfaces" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" { }
    }
    SubShader {
        // Render the front-facing parts of the object.
        // We use a simple white material, and apply the main texture.
        Pass {
            Material {
                Diffuse (1,1,1,1)
            }
            Lighting On
            SetTexture [_MainTex] {
                Combine Primary * Texture
            }
        }
        // Now we render the back-facing triangles in the most
        // irritating color in the world: BRIGHT PINK!
        Pass {
            Color (1,0,1,1)
            Cull Front
        }
    }
}
Shader "Simple Glass" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
        _MainTex ("Base (RGB)", 2D) = "white" { }
    }
    SubShader {
        // We use the material in many passes by defining them in the subshader.
        // Anything defined here becomes default values for all contained passes. 任何在这里定义的东西都会成为默认值(对所有passes有效)。
        Material {
            Diffuse [_Color]
            Ambient [_Color]
            Shininess [_Shininess]
            Specular [_SpecColor]
            Emission [_Emission]
        }
        Lighting On
        SeparateSpecular On
        // Set up alpha blending 设置alpha混合
        Blend SrcAlpha OneMinusSrcAlpha
        // Render the back facing parts of the object.
        // If the object is convex, these will always be further away
        // than the front-faces.        // 如果物体是凸面物体,这些将比前表面更远
        Pass {
            Cull Front
            SetTexture [_MainTex] {
                Combine Primary * Texture
            }
        }
        // Render the parts of the object facing us.
        // If the object is convex, these will be closer than the
        // back-faces.
        // 如果物体是凸面物体,这些将比后表面更近
         Pass {
            Cull Back
            SetTexture [_MainTex] {
                Combine Primary * Texture
            }
        }
    }
}



4、Shader语法:Pass的纹理处理


unity3d 要支持中文 xml文件编码_ci_03


纹理处理是在做旧式的合并效果。你可以在1个pass中使用多个SetTexture命令--所有的纹理都在一个队列当中,就像多个图层在1个绘图程序中一样。SetTexture 命令必须处在Pass的末尾。


这个小例子,有两个纹理。首先,它设置首次合成只采用_MainTex,然后是使用_BlendTex的alpha通道进行_BlendTex的RGB颜色褪色



Shader "Examples/2 Alpha Blended Textures" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _BlendTex ("Alpha Blended (RGBA) ", 2D) = "white" {}
    }
    SubShader {
        Pass {
            // Apply base texture 设置基础纹理
            SetTexture [_MainTex] {
                combine texture
            }
            // Blend in the alpha texture using the lerp operator 使用插值操作混合alpha纹理
            SetTexture [_BlendTex] {
                combine texture lerp (texture) previous
            }
        }
    }
}


这个shader使用的的_MainTex的alpha分量去决定在哪应用照明。它分两个阶段来实现这个效果。在第一阶段,纹理的alpha值用于混合顶点颜色和白色固体。在第二阶段中,再乘以纹理的RGB值。



Shader "Examples/Self-Illumination" {
    Properties {
        _MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
    }
    SubShader {
        Pass {
            // Set up basic white vertex lighting
            Material {
                Diffuse (1,1,1,1)
                Ambient (1,1,1,1)
            }
            Lighting On
            // Use texture alpha to blend up to white (= full illumination)使用纹理alpha和白色混合
            SetTexture [_MainTex] {
                constantColor (1,1,1,1)
                combine constant lerp(texture) previous
            }
            // Multiply in texture
            SetTexture [_MainTex] {
                combine previous * texture
            }
        }
    }
}