Unity3D Shader官方教程翻译(四)

来源:互联网 发布:python write 编辑:程序博客网 时间:2024/05/16 12:49

Unity3D Shader官方教程翻译(四)


1、Shader语法:Pass的雾化处理


雾化混合产生像素的颜色是依据于常量颜色(这个常量颜色是基于摄像头的距离的)。雾化不会改变像素的alpha值,仅仅是改变它的rgb分量。

指导:雾化是一种模拟自然界中雾气对场景物体视觉效果产生影响的图形绘制技术。此技术从视点到物体逐渐将物体的绘制颜色淡化,直至背景色。通过雾化处理可较好的表现出物体到视点的距离感。(根据物体距离视点的远近对其进行恰当的模糊处理)

Fog { Fog Commands } 
在大括号内指定fog命令


  Mode Off | Global | Linear | Exp | Exp2 
定义个fog模式,默认的是全局,它转换为关闭或EXP2取决于是否打开渲染设置中的雾。
指导:Linear | Exp | Exp2 对应OpenGL中的GL_LINEAR(线性)、GL_EXP(指数)和GL_EXP2(指数平方)

Color ColorValue 
设置雾的颜色 
  
Density FloatValue 
设置雾的强度 

Range FloatValue , FloatValue 
设置线性雾的最近和最远值


请注意,如果您使用片断编程,着色器的雾设置将仍然适用。Unity3d的平台上,那里是没有固定功能雾的功能,Unity3d将在运行时修补着色器请求支持的雾模式。

2、Shader语法:Pass的Alpha测试

alpha测试是最后一个机会,拒绝将一个像素写到屏幕上。(可以理解为在将画面显示到屏幕上的最后1次修改,这次修改只能让该像素显示或不显示)


在最后的输出颜色被计算之后,这个颜色可以选择是否让自己的alpha值和一个固定值做比较。如果测试失败,这个像素将不在屏幕上显示。

指导:当每个像素即将绘制时,如果启动了Alpha测试,OpenGL会检查像素的Alpha值,只有Alpha值满足条件的像素才会进行绘制(严格的说,满足条件的像素会通过本项测试,进行下一种测试,只有所有测试都通过,才能进行绘制),不满足条件的则不进行绘制。这个“条件”可以是:始终通过(默认情况)、始终不通过、大于设定值则通过、小于设定值则通过、等于设定值则通过、大于等于设定值则通过、小于等于设定值则通过、不等于设定值则通过。

如果我们需要绘制一幅图片,而这幅图片的某些部分又是透明的(想象一下,你先绘制一幅相片,然后绘制一个相框,则相框这幅图片有很多地方都是透明的,这样就可以透过相框看到下面的照片),这时可以使用Alpha测试。将图片中所有需要透明的地方的Alpha值设置为0.0,不需要透明的地方Alpha值设置为1.0,然后设置Alpha测试的通过条件为:“大于0.5则通过”,这样便能达到目的。当然也可以设置需要透明的地方Alpha值为1.0,不需要透明的地方Alpha值设置为0.0,然后设置条件为“小于0.5则通过”。Alpha测试的设置方式往往不只一种,可以根据个人喜好和实际情况需要进行选择。

AlphaTest Off 
关闭alpha测试,渲染所有像素 
 
设置alpha测试:仅当像素的alpha值处在一定范围之内才渲染它

比较命令式下面中的1个

Greater   只渲染alpha值比AlphaValue大的像素 
GEqual   只渲染alpha值>=AlphaValue的像素 
Less       只渲染alpha值<AlphaValue的像素 
LEqual   只渲染alpha值<= AlphaValue的像素 
Equal     只渲染alpha值=AlphaValue的像素 
NotEqual 只渲染alpha值不等于AlphaValue的像素 
Always    渲染所有像素相当于关闭alpha测试 
Never     不渲染任何像素 


3、Shader语法:Pass的Blending(混合)


在所有着色器执行完毕,所有纹理都被应用,所有像素准备被呈现到屏幕之后, 使用Blend命令来操作这些像素进行混合。

指导:Blend 混合是将源色和目标色以某种方式混合生成特效的技术。混合常用来绘制透明或半透明的物体。在混合中起关键作用的α值实际上是将源色和目标色按给定比率进行混合,以达到不同程度的透明。α值为0则完全透明,α值为1则完全不透明。混合操作只能在RGBA模式下进行,颜色索引模式下无法指定α值。物体的绘制顺序会影响到OpenGL的混合处理。

这里是1个着色器的小例子:将一个纹理添加到屏幕上,无论它是否已经在屏幕上。

Shader "Simple Additive" {    Properties {        _MainTex ("Texture to blend", 2D) = "black" {}    }    SubShader {        Tags { "Queue" = "Transparent" }        Pass {            Blend One One            SetTexture [_MainTex] { combine texture }        }    }}

4、Shader语法:Pass的标记

Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
指定TagName1 的值为Value1. TagName2 的值为Value2.       你可以指定你所想需要的标记。


标签基本上是 键-值 配对形式。内部的pass标签用来控制光照管道(环境光照,顶点光照和像素光照等)中这个pass扮演的角色及其他一些选择。注意以下的标记必须在pass段中(而不是在SubShader中)被Unity识别。

5、Shader语法:Pass的Name

Name "PassName"
将当前Pass命名为 PassName 


6、Shader语法:Pass的BindChannels 绑定通道

可编程顶点着色器使用时,BindChannels将没有效果。在这种情况下,绑定受顶点着色器输入控制。
默认情况下,Unity3D 会为你计算并绑定,但在某些情况下,你要使用自定义绑定。

BindChannels { Bind "source", target }

源可以是下面其中的一个
Vertex:顶点:顶点的位置
Normal:法线:顶点的法线
Tangent:切线:顶点的切线
Texcoord:主要的UV坐标
Texcoord1:次要的UV坐标
Color:颜色:每个顶点颜色


7、Shader语法 UsePass

UsePass命令可以调用在另外1个Shader中已经被命名的passes 。

UsePass "Shader/Name"

插入指定Shader中的已经被命名的pass.   Shader/Name 包含了Shader的名字和其中pass的名字,它们用斜杠来分割。


8、Shader语法 GrabPass

Shader "GrabPassInvert" {    SubShader {        // Draw ourselves after all opaque geometry 在所有不透明的几何对象之后绘制自己,        Tags { "Queue" = "Transparent" }        // Grab the screen behind the object into _GrabTexture  捕捉对象之后的屏幕内容并放到_GrabTexture 纹理中         GrabPass { }        // Render the object with the texture generated above, and invert it's colors 使用上面产生的纹理,进行颜色反相        Pass {            SetTexture [_GrabTexture] { combine one-texture }        }    }} 

9、Shader语法 FallBack

在所有Subshaders之后可以定义1个FallBack。它的意义是:如果没有1个subshaders可以运行在这个硬件上,那么就试图使用其他shader中的一个。

Fallback "name"
返回给定名称的着色器
 
Fallback Off
关闭Fallback,就算没有subshader在显卡上运行,也不会有任何返回和警告。


转自:http://www.j2megame.com

0 0
原创粉丝点击