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命令影响

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


当渲染任何几何图形时候,顶点颜色和光照是第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 OnSeparateSpecular OnSetTexture [_MainTex] {Combine texture * primary DOUBLE, texture * primary}}}
} 

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

面剔除是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 OnCull 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 OnSetTexture [_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 OnSeparateSpecular 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 FrontSetTexture [_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 BackSetTexture [_MainTex] {Combine Primary * Texture}}}
} 

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

纹理处理是在做旧式的合并效果。你可以在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 lightingMaterial {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 textureSetTexture [_MainTex] {combine previous * texture}}}
}

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

Unity3D Shader官方教程翻译(三)相关推荐

  1. Dapper官方教程翻译8:Dapper方法之QueryMultiple(转)

    Dapper官方教程翻译8:Dapper方法之QueryMultiple 2019年02月28日 10:42:22 Day_and_Night_2017 阅读数:120 QueryMultiple方法 ...

  2. 【游戏渲染】【译】Unity3D Shader 新手教程(1/6)

    http://gad.qq.com/article/detail/7175490 该文章来自用户转载 点击阅读原文 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散, ...

  3. Unity3D Shader 新手教程(1/6)

    刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D Shader编程望而却步.该系列教程的第一篇文章(译者注:即本文,后续还有5篇文章) ...

  4. 【译】Unity3D Shader 新手教程(1/6)

    刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D Shader编程望而却步.该系列教程的第一篇文章(译者注:即本文,后续还有5篇文章) ...

  5. Caffe官方教程翻译(9):Multilabel Classification with Python Data Layer

    前言 最近打算重新跟着官方教程学习一下caffe,顺便也自己翻译了一下官方的文档.自己也做了一些标注,都用斜体标记出来了.中间可能额外还加了自己遇到的问题或是运行结果之类的.欢迎交流指正,拒绝喷子! ...

  6. Caffe官方教程翻译(5):Classification: Instant Recognition with Caffe

    前言 最近打算重新跟着官方教程学习一下caffe,顺便也自己翻译了一下官方的文档.自己也做了一些标注,都用斜体标记出来了.中间可能额外还加了自己遇到的问题或是运行结果之类的.欢迎交流指正,拒绝喷子! ...

  7. Java官方教程(三-1)运算符 operator(2020.12.18)

    前言 本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,几乎每日更新,感兴趣的朋友可以关注一下橙子:翻译过程中尽可能多的对一些关键词保留了英文原文,如果你想看最纯正的英文原版教材却又看不懂,可以试着 ...

  8. Java官方教程(三-3)相等 关系和条件运算符(2020.12.20)

    前言 本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,几乎每日更新,感兴趣的朋友可以关注一下橙子:翻译过程中尽可能多的对一些关键词保留了英文原文,如果你想看最纯正的英文原版教材却又看不懂,可以试着 ...

  9. Caffe官方教程翻译(10):Editing model parameters

    前言 最近打算重新跟着官方教程学习一下caffe,顺便也自己翻译了一下官方的文档.自己也做了一些标注,都用斜体标记出来了.中间可能额外还加了自己遇到的问题或是运行结果之类的.欢迎交流指正,拒绝喷子! ...

最新文章

  1. java 线程 通过interrupted_Java线程的传说(1)——中断线程Interrupted的用处
  2. c++ STL容器初探
  3. Python工程目录组织
  4. 【转载】Callable、FutureTask中阻塞超时返回的坑点
  5. NeurIPS 2021 | 图上不均衡表示学习新视野:基于拓扑结构的不均衡学习
  6. prim 算法加模板
  7. Homebrew是什么?怎么关闭自动更新?
  8. 信号的基本概念以及信号的产生
  9. 快速实现word、excel、ppt、txt等办公文件在线预览功能(Java版)
  10. jQuery操作radio、checkbox、select 集合
  11. pam_limits(sshd:session): unknown limit item 'noproc'
  12. Android 中自定义控件和属性(attr.xml,declare-styleable,TypedArray)的方法和使用 一
  13. Java函数、参数及传参方式详解
  14. 从祖师级到新生代,48位开发者的“武功秘籍”
  15. 极速office(excel)如何查找出重复内容
  16. 磁盘阵列 and RAID技术简介
  17. openpyxl操作excel 删除行
  18. HC32F005 国产低功耗华大MCU芯片介绍
  19. c语言 数字翻译成英文,100数字翻译成英语?
  20. 微信微信人工客服电话/微信客服怎么正确拨打在线服务电话

热门文章

  1. VS2010 控件集总介绍
  2. 计算机考研的意义,2019计算机考研数据结构复习:重要意义
  3. android 震动Vibrator
  4. java地铁最短距离_动手构建地铁关系网,实现最短路径查询
  5. 土方量计算的准确作法
  6. 高等数学极限学习笔记
  7. .sql文件导入错误
  8. 点石互动--highdiy之:如果没有NoFollow
  9. Linux/UNIX学习之管道
  10. postgreSql 数据库存储目录