ShaderLab
2016-07-02 17:48:47 0 举报
AI智能生成
ShaderLab是一种用于编写着色器代码的高级编程语言,它被广泛应用于计算机图形学和游戏开发领域。ShaderLab允许开发者创建自定义的着色器,以实现各种视觉效果,如光照、纹理映射、阴影等。通过编写ShaderLab代码,开发者可以精确控制渲染过程的每一个细节,从而实现高度定制化的图形效果。ShaderLab语言具有丰富的功能和灵活的语法,使得开发者可以轻松地实现复杂的着色器算法。此外,ShaderLab还支持跨平台开发,可以在各种主流的游戏引擎和渲染引擎中使用。总之,ShaderLab是计算机图形学和游戏开发领域的重要工具,为开发者提供了强大的着色器编程能力。
作者其他创作
大纲/内容
Properties
Name("显示文字",属性类型)=Default Value
属性类型对应CG数据类型
Color、Vector
float4、half4、fixed4
Range、Float
float、half、fixed
Cube
samplerCube
2D
sampler2D
3D
sampler3D
SubShader
Tags可选的
Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
Stencil模板
遮罩/控制者物体
ColorMask 0
屏蔽颜色的输出.即不输出颜色到屏幕
ZWrite Off
关闭深度写入.防止把后面的像素剔除掉
ReferenceValue 1
两个相同值的物体才会产生遮罩
Comp Always
保证模板测试始终通过
Pass Replace
将stencilBufferValue刷新为1
被遮罩物体
ReferenceValue 1
Comp Equal
如果referenceValue=stencilBufferValue,则模板测试通过,渲染像素,否则抛弃
RenderSetup可选状态
Cull
Cull Back | Front | Off
设置剔除模式:背向/朝向摄像机的面/正面/关闭剔除
在渲染的时候,默认情况下是只有朝向摄像机的面才会被渲染,可以告诉Unity,我想渲染哪一个朝向的面,使用Cull命令在计算体积阴影的时候会用到对Cull的操作来计算和物体相交的投影
ZTest
ZTest Less Greater | LEqual | Gequal | Equal | NotEqual | Always
设置深度测试使用的函数
ZWrite
ZWrite On | Off
开启/关闭深度写入
Blend
Off
关闭混合
Blend SrcFactor DstFactor
开启并设置混合模式
Blend SrcAlpha OneMinusSrcAlpha
Blend SrcFactorA DstFactorA,SrcFactorA DstFactorA
使用不同因子来混合透明通道
BlendOperation
并非是把源颜色和目标简单相加后混合.而是使用BlendOperation对它们进行其他操作
Pass{}
Vertexte Shader顶点
Fragment Shader片元
Other Pass{}
Surface表面着色器
编译指令
#pragma surface surfaceFuntion LightModel [optionalparams]
Input结构体
float2 uv_MainTex:TEXCOORD0
float2 uv2_MainTex:TEXCOORD1
float4 color:COLOR
包含插值后逐顶点颜色.
float3 viewDir
包含了视角方向.可用于计算边缘光照等
float4 screenPos
包含了屏幕空间的坐标.可以用于反射或屏幕特效.
float3 worldPos
包含了世界空间下的位置
float3 worldRefl
包含了世界空间下的反射方向.前提是没有修改表面法线o.Normal
float3 worldRefl;INTERNAL_DATA
如果修改了表面法线o.Normal.需要使用该变量告诉Unity要基于修改后的发现计算世界空间下的反射方向.
在表面函数中,我们需要使用WorldReflectionVector(IN,o.Normal)来的刀世界空间下的反射方向
float3 worldNormal
包含了世界空间的表面法线.前提没有修改表面法线o.Normal
float3 worldNormal;INTERNAL_DATA
如果修改了表面法线o.Normal,需要使用该变量告诉Unity要基于修改后的法线计算世界空间下的法线方向.
在表面函数中,我们需要使用WorldNormalVector(IN,o.Normal)来得到世界空间下的法线方向
可以放在Pass
CGPROGRAM
#pragma vertex vert
逐顶点传参
#pragma fragment frag
Shader Target指定shader等级
#pragma target 2.0
默认的shader target等级.相当于DX9上的shader model2.0.不支持对顶点纹理采样.不支持LOD显式纹理采样等
#pragma target 3.0
DX9上的shader model3.0.支持对顶点纹理采样等.
#pragma target 4.0
DX10上的shader model4.0.支持几何着色器等
#pragma target 5.0
DX11上的shader model5.0
引入CG头文件
#include "UnityCG.cginc"
包含了最常用的帮助函数、宏、结构体
appdata_base
用于顶点着色器的输入
顶点位置、顶点法线、第一组纹理位置坐标
appdata_tan
可用于顶点着色器的输入
顶点位置、顶点法线、顶点切线、第一组纹理坐标
appdata_full
可用于顶点着色器的输入
顶点位置、顶点法线、顶点切线、四组或更多纹理坐标
appdata_img
可用于顶点着色器的输入
顶点位置、第一组纹理坐标
v2f_img
可用于顶点着色器的输出
裁剪空间的位置、纹理坐标
float3 WorldSpaceViewDir(float4 v)
输入一个模型空间中的顶点位置.返回世界空间中从该点到摄像机的观察方向
点看向摄像机的方向?
float3 ObjSpaceViewDir(float4 v)
输入一个模型空间的顶点位置.返回模型空间中从该点到摄像机的观察方向
float3 WorldSpaceLightDir(float4 v)
仅可用于向前渲染中.输入一个模型空间的顶点位置.返回世界空间中该点到光源的光照方向.没有被归一化
float3 ObjSpaceLightDir(float4 v)
仅可用于向前渲染中.输入一个模型空间中的顶点位置.返回模型空间中该点到光源的光照方向.没有被归一化
float3 UnityObjectToWorldNormal(float4 v)
把法线方向从模型空间转换到世界空间
float3 UnityObjectToWorldDir(float4 v)
把方向矢量从模型空间转换到世界空间
#include "UnityUI.cginc"
UnityShaderVariables.cginc
在编译unity时,会被自动包含进来.包含了许多内置全局变量.如UNITY_MATRIX_MAX等
Lighting.cginc
包含了各种内置的光照模型,如果编写的是SurfaceShader会自动包含进来
HLSLSupport.cginc
在编译UnityShader时.会被自动包含进来.声明了很多用于跨平台的宏和定义
fixed4 _Color类型和变量名和属性名相同
struct 结构名称{};
float4 name:POSITION;
a2v(APP数据传到Vertex着色器)
v2f(Vertex着色器处理后的数据传到fragment片元着色器)
float4 vert(float4 v:POSITION):SV_POSITION{}
POSITION语义.输入代表顶点位置
SV_POSITION输出的是裁剪空间的顶点坐标
输入和输出(返回)值类型似乎是一样的
struct v2f{};
float4 name:SV_POSITION模型顶点在裁剪空间的位置
fixed3 color:COLOR0-COLOR0语义可以存储颜色
fixed4 frag():SV_Target{}
SV_Target把返回颜色输出到渲染目标
ENDCG
语义
a2v模型数据给顶点着色器
float4 POSITION模型空间的顶点位置
float3 NORMAL模型空间的法线方向
float4 TANGENT顶点切线
float2/4 TEXCOORD0第一套纹理坐标
float2/fixed2 COLOR 顶点颜色
v2f顶点着色器传数据给片元着色器
float4 SV_POSITION裁剪空间的顶点坐标.结构体中必须包含一个用该语义修饰的变量
float4 COLOR0通常用于输出第一组顶点颜色.但不是必须的
float4 COLOR1通常用于输出第二组顶点颜色.但不是必须的
float2 TEXCOORD0-7通常用于输出纹理坐标.但不是必须的
片元着色器输出Unity时的语义
fixed4 SV_Target/COLOR输出值会存储到渲染目标(Renderer Target)中.等同DX9的COLOR语义
Fallback
Fallback "name"/off.如果pass不能运行.就运行这个
渲染队列
1000Background
这个渲染队列会在其他任何队列先被渲染.我们通常使用该队列渲染那些需要绘制在背景上的物体
2000Geometry
默认的渲染队列.大多数物体都使用这个队列.不透明物体使用这个队列.
2450AlphaTest
需要透明测试的物体使用这个队列.
3000Transparent
这个队列中的物体会在所有Geometry和AlphaTest渲染之后.再从后往前顺序进行渲染.
任何使用了透明度混合的物体都应该使用该队列(比如关闭了深度写入的Shader)
4000Overlay
该队列用于实现一些叠加效果.任何需要在最后渲染的物体都应该使用该队列
透明测试实现透明
"Queue"="AlphaTest"
透明度混合实现透明
"Queue"="transparent";Pass{ZWrite Off}
0 条评论
下一页