赞
踩
看了好多次shader,不过还是感觉无从下手的去写shader,然后看shader的效果
个人认为还是因为shader基础打得不够扎实,顾特意再重温shader相关书籍的时候,看见有些常用关键字时,把他记录下来
希望这对学习unity shader的同学来说有些用
语法 | 说明 |
---|---|
name(“display name”,Range(min,max)=number) | 定义一个范围值 |
name(“display name”,Color=(number,number,number,number) | 定义颜色,number取0~1 |
name(“display name”,2D)=”name”{option} | 定义2D纹理,缺省值:”white”,”black”,”gray”,”bump” |
name(“display name”,Rect)=”name”{option} | 定义矩形纹理(非2的n次幂),缺省值为2D纹理属性 |
name(“display name”,Cube)=”name”{option} | 定义立方体纹理,缺省值同位2D纹理 |
name(“display name”,Float)=number | 定义一个浮点数 |
name(“display name”,Vector)=(number,number,number,number) | 定义四维向量 |
选项名称 | 说明 |
---|---|
TexGen | 自动生成纹理坐标时的模式,可以为:ObjectLiner、EyeLinear、SphereMap、CubeMap、CubeNormal |
LightmapMode | 光照贴图模式,如果给出这个选项,纹理会被渲染器的光线贴图所影响,即纹理不能被应用在材质中,而是使用渲染器中的设定 |
Tags {“Queue”=”Transparent”}
队列名称 | 说明 |
---|---|
Background | 后台,这个渲染队列在所有渲染队列之前渲染,被用于天空盒之类的对象(1000) |
Geometry | 几何体,这个是默认队列,被用于大多数对象,不透明的几何体使用这个队列(2000) |
Transparent | 透明,在几何体队列之后渲染,采用由后到前的次序,任何采用alpha混合的对象(不对深度缓冲产生写操作的着色器)应该在这里渲染(如玻璃,粒子等)(3000) |
Overlay | 覆盖,这个渲染队列用于实现叠加效果,任何需要最后渲染的对象应该放置在此处(如镜头光晕)(4000) |
两个特殊通道
通道名称 | 语法 | 说明 |
---|---|---|
UsePass | UsePass “Shader/Name” | 插入所有来自给定着色器中的给定名字的通道,Shader为着色器的名字,Name是通道的名字 |
GrabPass | GrabPass{[“纹理名”]} | 捕获屏幕到一个纹理,该纹理通常使用在靠后的通道中,”纹理名”是可选的 |
UsePass例子:
UsePass “Specular/BASE”
Name “MyPassName”
使用Specular/BASE这个Pass,并在当前shader中重命名为MyPassName使用
所有通道名字都是大写开头,因此UsePass必须使用大写开头的名字来书写索引
GrabPass捕获当前屏幕内容到一个纹理中,纹理能在后续通道中通过_GrabTexture进行访问
通道渲染设置命令
命令 | 说明 |
---|---|
Material{材质块} | 定义一个使用顶点光照管线的材质 |
Lighting 开关状态 | 开启或关闭顶点光照。开关状态值为On或Off |
Cull 裁剪模式 | 设置裁剪模式,裁剪模式有Back、Front、Off |
ZTest 测试模式 | 设置深度测试模式。测试模式有Less、Greater、LEqual、GEqual、Equal、NotEqual、Always |
ZWrite 开关状态 | 开启或关闭深度缓冲,开关值为On或Off |
Fog{雾块} | 设置雾参数 |
AlphaTest 测试模式< alpha测试值 > | 开启alpha测试,测试模式有Less、Greater、LEqual、GEqual、Equal、NotEqual、Always |
Blend 混合模式 | 设置alpha混合模式,混合模式有SourceBlendMode、DestBlendMode |
Color <颜色> | 设置当顶点光照关闭时使用的颜色 |
ColorMask 颜色值 | 设置颜色遮罩,颜色值可以使用RGB或A或0或任何R、G、B、A的组合,设置为0将关闭所有颜色通道的渲染 |
Offset 偏移因子,偏移单位 | 设置深度偏移,这个命令仅接受常数参数 |
SeparateSpecular 开关状态 | 开启或关闭顶点光照相关的镜面高光颜色。开关状态的值为On或Off |
ColorMaterial 颜色集 | 当计算顶点光照时使用顶点颜色,颜色集可以是AmbientAndDiffuse,也可以是Emission |
关于混合因子
OpenGL红宝书上的解释为:
源因子:就是当前的贴图,或光照计算后生成的颜色值
目标因子:就是显示器中的帧缓存的图
常用混合因子(对源因子和目标因子都有效)如下:
混合因子 | 说明 |
---|---|
One | 值为1,使用此设置来让源或是目标颜色完全地通过 |
Zero | 值为0,使用此设置来删除源或目标值 |
SrcColor | 此阶段的值是乘以源颜色的值 |
SrcAlpha | 此阶段的值是乘以源alpha的值 |
DstColor | 此阶段的值是乘以帧缓冲区目标颜色的值 |
DstAlpha | 此阶段的值是乘以帧缓冲区目标alpha的值 |
OneMinusSrcColor | 此阶段的值是乘以(1-源颜色) |
OneMinusSrcAlpha | 此阶段的值是乘以(1-源alpha) |
OneMinusDstColor | 此阶段的值是乘以(1-目标颜色) |
OneMinusDstAlpha | 此阶段的值是乘以(1-目标alpha) |
以下是常见的混合类型:
通道标签只能在通道(而不是子着色器)中使用
常用光照模式标签表如下:
标签 | 说明 |
---|---|
Always | 总是渲染,没有光照应用 |
ForwardBase | 环境光,主要的定向光,顶点/SH光被应用 |
ForwardAdd | 附加的逐像素光照被应用。每个光照1个通道 |
PrepassBase | 渲染法线/镜面指数 |
PrepassFinal | 使用纹理,光照和自发光混合出最终的颜色 |
Vertex | 当物体没有光照映射使用顶点光照渲染,所有顶点光照被应用 |
VertexLMRGBM | 当物体有光照映射时使用顶点光照渲染,在平台上光照映射是RGBM编码 |
VertexLM | 当物体有光照映射时使用顶点光照渲染,在平台上光照映射是double-LDR编码(移动平台,以及老师CPU) |
ShadowCaster | 将物体当做阴影产生者来渲染 |
ShadowCollector | 为了正向渲染路径将对象的阴影收集到屏幕空间缓冲区中 |
- RequireOptions
- 当某些额外条件满足时,该通道才会被渲染,它的值是SoftVegetation,需要在Quality Settings中开启SoftVegetation才渲染通道
表面函数
表明那些CG函数中有表面着色器的代码,这个函数的格式如下:
void surf(Input IN,inout SurfaceOutpur o)
光照模式
在光照模式中使用,内置的光照模式有Lamberr(漫反射)和BlinnPhong(高光)
可选参数
可选参数列表如下:
可选参数 | 说明 |
---|---|
alpha | Alpha混合模式,使用它可以写出用以渲染半透明效果的着色器 |
alphatest:VariableName | Alpha测试模式,使用它可以写出镂空效果的着色器。楼口大小的变量(VariableName)是一个float型的变量 |
vertex:VertexFunction | 自定义的顶点函数,VertexFunction为函数名 |
finalcolor:ColorFunction | 自定义的最终颜色函数,ColorFunction为函数名 |
exclude_path:prepass或exclude_path:forward | 使用指定的渲染路径,不需要生成通道 |
addshadow | 添加阴影投射并且集合通道,通常用于自定义顶点的修改,使阴影也能投射在任何过程的顶点动画上 |
dualforward | 在正向(forward)渲染路径中使用双重光照贴图(dual lightmap) |
fullforwardsshadows | 在正向(forward)渲染路径中支持所有阴影类型 |
decal:add | 添加贴花着色器 |
decal:blend | 混合半透明的贴花着色器 |
softvegetation | 使表面着色器仅能在Soft Vegetation打开时进行渲染 |
noambient | 不使用任何环境光照(ambient lighting)或者球面调和光照(spherical harmonics lights) |
novertexlights | 在正向渲染(Forward rending)中不使用球面调和光照(spherical harmonics lights)或每顶点光照(per-vertex lights) |
nolightmap | 在这个着色器上禁用光照贴图(lightmap) |
nodirlightmap | 在这个着色器上禁用方向光照贴图(directional lightmap) |
noworwardadd | 禁用正向渲染添加通道,这会使这个着色器支持一个完整的方向光和所有逐顶点/SH计算的光照 |
approxview | 当着色器有需要的时候,计算每个顶点,而不是每个像素的方向,这样更快,但是当摄像机接近表面时,视图方向不完全正确 |
halfasview | 在光照函数中传递进来的是half-direction向量,而不是视图方向向量,Half-direction计算且将每个顶点标准化,这样更快,但不完全正确 |
标准的表面着色器输出结构体如下:
struct SurfaceOutput {
half3 Albedo; //反射光颜色
half3 Normal; //法线
half3 Emission; //自发光,用于增强物体自身的亮度,使之看起来好像可以自己发光
half Specular; //镜面高光
half Gloss; //光泽度
half Alpha; //透明度
};
表面着色器的输入结构体Input包含着所有着色器所需要的纹理坐标和附加值
纹理坐标必须在纹理名称前面加上”uv”,或者以”uv2”作为头命名来使用第二个纹理坐标集
附加值按需要加入Input中,常用附加值如下所示:
附加值 | 说明 |
---|---|
float3 viewDir | 视图方向,为了计算视差、边缘光照等效果,Input需要包含视图方向 |
float4 with COLOR semantic | 每个顶点颜色的插值 |
float4 screenPos | 屏幕空间中的位置,为了获得反射效果,需要包含屏幕坐标 |
float3 worldPos | 世界坐标 |
float3 worldRefl | 世界空间中的反射向量。如果表面着色器不写入法线(o.Normal)参数,将包含这个参数 |
float3 worldNormal | 世界空间中的法线向量。如果表面着色器不写入法线(o.Normal)参数,将包含这个参数 |
float3 worldRefl;INTERNAL_DATA | 内部数据。如果表面着色器写入了o.Normal,将包含世界反射向量。为了得到基于每个像素的法线贴图的反射向量需要使用世界反射向量(WorldReflection(IN,o.Normal)) |
float3 wroldNormal;INTERNAL_DATA | 内部数据。如果表面着色器写入了o.Normal,将包含世界法线向量。为了得到基于每个像素的法线贴图的法线向量需要使用世界反射向量(WorldReflection(IN,o.Normal)) |
在一个子着色器的Tags中可以设置RenderType,格式如:
Tags {“RenderType” = “Opaque”}
而RenderType的参数如下所示:
顶点片元着色器不使用灯光交互,实际着色器代码用CG或HLSL语言编写,嵌入在着色器的通道块中,常用编译指令表如下所示:
编译指令 | 说明 |
---|---|
pragma vertex | 声明以name为名字的函数是顶点程序 |
pragma fragment | 声明以name为名字的函数是片元程序 |
pragma fragmentoption | 添加选项到编译的OpenGL片元程序,通过OpenGL的ARB_fragment_program可以查询到所允许的规范的选项列表,这个指令对顶点程序或者不是以OpenGL为编译目标的程序无效 |
pragma target | 着色器目标编译 |
pragma only_renderers | 仅用给定的渲染器编译着色器。默认情况下用所有的渲染器都编译着色器。当选择多个渲染器时用空格隔开 |
pragma exclude_renderers | 不用给定的渲染器编译着色器。默认情况下用所有的渲染器都编译着色器。当选择多个渲染器时用空格隔开 |
pragma glsl | 用桌面OpenGL平台编译着色器时,将Cg/HLSL转换成GLSL而不是默认的ARB顶点片元着色器 |
在only_renderers和exclude_renderers中的渲染器如下:
渲染器 | 渲染器指令代码 |
---|---|
Direct3D 9 | d3d9 |
OpenGL | opengl |
OpenGL ES 2.0 | gles |
Xbox 360 | xbox360 |
PlayStation 3 | ps3 |
Flash | flash |
使用方法:#pragma only_renderers opengl
注意:每个顶点片元着色器必须包含一个顶点程序或者片元程序(或两者兼有),因此需要一个#pragma vertex命令或者#pragma fragment命令(或两者兼有)
成员 | 说明 |
---|---|
float4 vertex | 顶点位置 |
float3 normal | 顶点法线 |
float4 texcoord | 第一UV坐标 |
float4 texcoord1 | 第二UV坐标 |
float4 tangent | 切线向量(用在法线贴图中) |
float4 color | 每个顶点(per-vertex)颜色 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。