Shader 基础语法

Shader 渲染顺序

先渲染不透明物体,顺序是从前到后;再渲染透明物体,顺序是从后到前

Properties块

属性类型CG变量类型定义方式
Intint_IntType (“Count”, Int) = 1
Floatfloat,half,fixed_FloatType(“Rate”, Float) = 1.5
_FloatType(“Rate”, Range(0,5)) = 1.5
Vectorfloat4,half4,fixed4_VectorType (“Vector”, Vector) = (1,2,3,4)
四维数
Rangefloat,half,fixed_RangeType (“Range”, Range(0.1, 0.5)) = 0.2
介于最小值和最大值之间的浮点数
Colorfloat4,half4,fixed4_ColorType (“Color”, Color) = (1,1,1,1)
颜色,由RGBA(红绿蓝和透明度)四个量来定义
2Dsampler2D_2DType (“2DTex”, 2D) = “white”{}
2的阶数大小的贴图 在采样后被转为对应基于模型UV的每个像素的颜色
CubesamplerCube_CubeType (“CubeTex”, Cube) = “white”{}
6张关联的2D贴图,主要用来做反射效果(比如天空盒和动态反射)
3Dsampler3D_3DType (“3DTex”, 3D) = “black”{}
Rectsampler2D非2阶数大小的贴图

如果在Properties使用2D,CG里要用sampler2D,代表使用的是2维纹理
如果在Properties使用color, CG里要用fixed4
如果在Properties使用Range, CG里要用half,实际上描述的是一个float
其中贴图属性的字符串要么为空(""),要么为内置的纹理名称(“white”, “black”, “gray”, “bump”)

Properties块中的特殊命令

命令参数说明
[HideInInspector]
[Header(text)]不要加引号,不支持中文括号内即为头标题的显示文字
[NoScaleOffset]隐藏贴图的Tilling和Offset选项
[Toggle][Toggle]_toggle("_toggle",int)=0同[MaterialToggle] 模拟开关 1真0假
[ToggleOff]
[Gamma]
[Enum(UV0,0,UV1,1)][Enum(UV0,0,UV1,1)]_UVSec (“UV Set for secondary textures”, Float) = 0

SubShader块

RenderType

Tags { “RenderType”=“XXX” } 用于替代渲染和获取场景深度和法线信息

名称描述
Opaque不透明:大部分着色器(普通物体,法线,自发光,反射,地形着色器)
Transparent用于半透明着色器(透明物体,粒子,字体,地形附加物(草,花,树))
TransparentCutout蒙皮透明着色器(两个通道的植被着色器)。用于缕空效果
Background天空盒着色器
OverlayGUITexture,镜头光晕,屏幕闪光等效果使用的着色器
TreeOpaque地形引擎中的树皮
TreeTransparentCutout地形引擎中的树叶
TreeBillboard地形引擎中的广告牌树,永远面向摄像机
Grass地形引擎中的草
GrassBillboard形引擎何中的广告牌草

Queue

Tags { “Queue”=“XXX” } 设置渲染队列,值越小越先渲染

名称队列索引描述
Background1000最早被调用的渲染,用来渲染天空盒或者背景
Geometry2000默认渲染队列,不透明物体使用(普通情况,场景中的绝大多数物体应该是非透明的)
AlphaTest2450有透明通道,需要进行Alpha Test的物体的队列,比在Geomerty中更有效
Transparent3000以从后往前的顺序渲染透明物体,使用透明度混合或关闭深度写入的shader
Overlay4000用来渲染叠加的效果,是渲染的最后阶段(比如镜头光晕等特效)

Tags { “DisableBatching”=“true/false” } 禁用批处理
Tags { “ForceNoShadowCastin”=“true/false” } 禁止投射阴影
Tags { “IgnoreProjector”=“true/false” } 忽略Projector,通常用于半透明物体
Tags { “CanUseSpriteAtlas”=“true/false” } 当该SubShader用于Sprite时用false
Tags { “PreviewType”=“Plane/SkyBox” } 预览形状
Tags { “PerformanceChecks”=“true/false” }

透明效果

透明度测试:不需要关闭深度写入,透明度不达标就去掉,所以物体要么不透明要么完全透明
Tags {“Queue”=“AlphaTest”}
使用clip函数进行透明度测试


透明度混合:可以得到真正的半透明效果。原理是将透明度与颜色缓冲的颜色混合得到新的颜色。但是这需要关闭深度写入。只有关闭深度写入才能把保证半透明物体不影响不透明物体或半透明后面半透明物体的渲染
ZWrite Off
Tags {“Queue”=“Transparent”}

ZTest 深度测试

针对当前对象在屏幕上(更准确的说是frame buffer)对应的像素点,将对象自身的深度值与当前该像素点缓存的深度值进行比较,如果通过了,本对象在该像素点才会将颜色写入颜色缓冲区,否则不写入颜色缓冲

ZTest Less深度小于当前缓存则通过
ZTest Greater深度大于当前缓存则通过
ZTest Equal深度等于当前缓存则通过
ZTest LEqual深度小于等于当前缓存则通过
ZTest GEqual深度大于等于当前缓存则通过
ZTest NotEqual深度不等于当前缓存则通过
ZTest Never
ZTest Always不论如何都通过
ZTest OffZTest Off 等同于 ZTest Always

ZWrite 深度写入

物体是否会写入深度,除了ZWrite状态之外,更重要的是需要深度测试通过,如果ZTest没通过,也不会写入深度
ZWrite On 开启深度写入
ZWrite Off 关闭深度写入


如果深度测试失败,说明这个像素对应的位置,已经有一个更靠前的东西了,即使写入也没有原来的更靠前,那么也就没有必要再去写入深度了,ZTest分为通过和不通过,ZWrite分为开启和关闭,一共就是四种情况:

  1. 深度测试通过,深度写入开启:写入深度缓冲区,写入颜色缓冲区;
  2. 深度测试通过,深度写入关闭:不写深度缓冲区,写入颜色缓冲区;
  3. 深度测试失败,深度写入开启:不写深度缓冲区,不写颜色缓冲区;
  4. 深度测试失败,深度写入关闭:不写深度缓冲区,不写颜色缓冲区;

Blend 颜色混合模式

Blend Off 关闭颜色混合模式,默认值
Blend SrcFactor DstFactor
最终颜色=SrcFactor源颜色(即计算出来的片元颜色值)+DstFactor目标颜色(即颜色缓冲区中的颜色值)SrcFactor和DstFactor的值可以为以下任一值

One1
Zero0
SrcColor源颜色(计算出来的片元颜色值)
SrcAlpha源透明度
DstColor目标颜色(颜色缓冲区中的颜色值)
DstAlpha目标透明度
OneMinusSrcColor1 - 源颜色
OneMinusSrcAlpha1 - 源透明度
OneMinusDstColor1 - 目标颜色
OneMinusDstAlpha1 - 目标透明度

Blend Op 采用操作符进行计算

Add源颜色 + 目标颜色
Sub源颜色 - 目标颜色
RevSub目标颜色 - 源颜色
Min取源颜色和目标颜色中的较小者
Max取源颜色和目标颜色中的较大者
Blend OpColor,OpAlpha相似,只是把透明通道分离出来了

Cull

Cull Back剔除内侧,只显示外侧。默认值
Cull Front剔除外侧,只显示内侧
Cull Off关闭剔除, 内外都展示

LOD

在Unity的Quality Settings中我们可以设定允许的最大LOD,当设定的LOD小于SubShader所指定的LOD时,这个SubShader将不可用

VertexLit及其系列 = 100
Decal, Reflective VertexLit = 150
Diffuse = 200
Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
Bumped, Specular = 300
Bumped Specular = 400
Parallax = 500
Parallax Specular = 600

Pass块

Name “MYPASSNAME”

为该Pass命名,用于在其他Shader中通过UsePass命令调用该Pass,即使使用小写字母命名,Unity也会自动转为大写字母,所以UsePass命令中也需写成大写字母

GrabPass { “TextureName” }

抓取屏幕并生成纹理,TextureName为自定义纹理名称,默认为_GrabTexture

Tags { “LightMode”=“XXX” }

只有定义了正确的LightMode才能得到一些Unity内置的光照变量
Unity shader中的pass的执行顺序是依据pass在shader中出现的先后顺序来确定的。 然后通过配制每个pass的LightMode Tag,来选择具体执行哪个pass
Unity的摄像机上支持3种RenderingPath,分别是VertexLit,Forward和Dferred Lighting,而shader中的LightMode标签Vertex,ForwardBase,forwardAdd,PrepassBase,PrepassFinal等,分别表示当前pass是为哪一个RenderingPath下设计使用的

名称描述
Always
ForwardBase
ForwardAdd
Deferred
ShadowCaster
MotionVectors
PrepassBase
PrepassFinal
Vertex
VertexLMRGBM
VertexLM

注:选择了Deferred时,优先选择deferred模式下的pass,如果找不到,则会选择forward模式下面的pass
选择了Forward时,优先选择Forward模式下的pass,如果找不到,则会选择Vertex模式下面的pass
Unity在一个时间只会执行一个渲染路径下的pass

关于这3个渲染路径之外的参数【Always】:
always + deferred:在选择deferred时,只执行deferred的pass
always + vertexLit:都会执行,并且谁靠前谁先执行
always + forward:都会执行,并且谁靠前谁先执行
而无参数执行顺序和always一样

Tags { “PassFlags”=“OnlyDirectional” } 仅传送主平行光、环境光和LightProbe的光照数据
Tags { “RequireOptions”=“SoftVegetation” } 满足给定条件才渲染该Pass

Stencil

模板(缓存)
Stencil buffer(模板缓存)可用于一般的像素遮罩或是剔除像素功能的地方使用。
模板缓存通常是每个像素位占8位的整型数据。缓存可以被写入数据,自增,或是自减。然后draw call时可以检测该像素对应的模板值,来决定在运行像素着色器前是否丢弃该像素。
(注意:上面是官方的说明,但是与实际的渲染管线有些不符,因为Stencil Test是在Fragment Shader之后的,那么有可能是与Early-Z类似的Early-Stencil)

Ref

参考值设置
Ref referenceValue
该值用于比较时参考用的(除了 Comp 设置为 always时,不会考虑比较,直接算是通过),该值也可以控制写入到模板缓存的,具体可以在pass/zfail/fail的StencilOp的枚举中来设置为replace

ReadMask

读入的掩码
ReadMask readMask
一个占8位的掩码,和 0~255的整型数值一样,用于在比较参考值(referenceValue & readkMask)与模板缓存的值(stencilBufferValue & readMask)。默认该ReadMask值为:255(8位bits全是1,意味所有位都可以通过掩码)

WriteMask

写入的掩码
WriteMask writeMask
一个占8位的掩码,和 0~255的整型数值一样,用于在写数据到模板缓存时的位掩码过滤。注意,就像其他的写入数据的掩码一样,指定哪些位是需要写入缓存中的(例如,WriteMask 0 意味着没有数据位的影响,且写入的将会是0)。默认是:255

Comp

设置参考值与模板值的比较方式
Comp comparisonFunction
这个function函数用于将参考值reference value与当前模板缓存的值比较时用的。默认是:always。(always的话,就是不同再比,直接pass过了的意思)

Pass

设置通过后的操作
Pass stencilOperation
当参考值与模板值得比较测试通过后(且深度测试也通过后)应该怎么操作模板缓存中的值。默认:keep。(keep就是保持缓存的值不变,意思不会缓存值有任何操作)

Fail

Fail stencilOperation
当参考值与模板值的比较测试失败后,应该怎么操作模板缓存中的值。默认:keep。(keep就是保持缓存的值不变,意思不会缓存值有任何操作)

ZFail

ZFail stencilOperation
当参考值与模板值的比较通过后,但深度测试没有通过,应该怎么操作模板缓存中的值。默认:keep。(keep就是保持缓存的值不变,意思不会缓存值有任何操作)
Comp,Pass,Fail 和 ZFail 都将应用于几何体的正面测试,除非正面给剔除了,这种情况将用于背面测试。你也可以直接指定两种面向的模板测试的应用,使用这些来定义正面的:CompFront,PassFront,FailFont,ZFailFont(对几何体正面的),和CompBack,PassBack,FailBack,ZFailBack(对于几何体背面的)

Comparison Function

参考值与缓存值的比较功能

枚举描述
Greater仅当参考值比缓存值大时才渲染该像素。
GEqual参考值大于或等于缓存值,才渲染像素。
Less小于缓存值
LEqaul小于或等于缓存值
Eqaul等于缓存值
NotEqaul不等于缓存值
Always不用测试,总是通过。(注意这个是默认值)
Never不用测试,反正都不通过

Stencil Operation

模板操作

枚举描述
Keep保持当前缓存值。(默认值)
Zero将0写入缓存值。
Replace将参考值写入缓存值。
IncrSat将缓存值自增1.如果缓存值本身255的数值了,那么保持255数据不变。
DecrSat将缓存值自减1.如果缓存值本身0的数值了,那么保持0数据不变。
Invert缓存值位取反。(相当于这样子吧:~(Value in buffer))
IncrWrap将缓存值自增1.如果缓存值本身255的数值了,那么将数据倒回0。
DecrWrap将缓存值自减1.如果缓存值本身0的数值了,那么将数据倒回255。

#include

#include “Lighting.cginc”
包含unity的内置的文件,才可以使用unity内置的一些变量

#prama指令

指令描述
vertex顶点函数名定义顶点函数入口
fragment片元函数名定义片元函数入口
surface表面着色器定义表面着色器函数入口
target2.0/2.5(default)/3.0/3.5(es3.0)/4.0/4.5(es3.1)/4.6(gl4.1)/5.0
geometry用于geometry shader,编译目标自动设为4.0
hull用于tessellation shader,编译目标自动设为4.6
domain同hull
only_renderersd3d9/d3d11/opengl/gles/xbox360/p3/flash指定渲染平台
exclude_renderers同only_renderers排除指定平台
multi_compile_fwdadd_fullshadows开启ForwardAdd中的阴影效果
multi_compile_fwdbase用于ForwardBase,保证光照衰减等光照变量被正确赋值
multi_compile_fwdadd用于ForwardAdd,保证光照衰减等光照变量被正确获取
multi_compile_fog使雾起作用

#pragma surface surf Lambert
#pragma surface surfaceFunction lightModel [optionalparams]
surface - 声明的是一个表面着色器
surfaceFunction - 着色器代码的方法的名字
lightModel - 使用的光照模型

CG程序块

Unity shader 由两个相对独立的块组成的
外层的属性声明,回滚等等是Unity可以直接使用和编译的 ShaderLab
CGPROGRAM…ENDCG这样一个代码块中,是一段CG程序
CG程序要访问在Properties中所定义的变量的话,必须使用和之前变量相同的名字进行声明

float:32位存储,用在坐标、未归一化的矢量、uv、一些调整参数
half:16位存储,范围 -60000~60000
fixed:11位存储,范围-2.0~2.0,用于存储颜色、归一化后的矢量、在这个范围内的参数等uv不能用fixed存储,因为可能通过贴图的Tiling和Offset让其范围超过[0, 1]

Unity内置函数

函数说明
float4 UnityObjectToClipPos(float3 pos)将顶点坐标从模型空间转换到裁剪空间
float3 UnityObjectToViewPos(float3 pos)将顶点坐标从模型空间转换到观察空间
TRANSFORM_TEX(tex,name)
(tex.xy * name##_ST.xy + name##_ST.zw)
根据贴图的tilling和offset值计算uv,需要定义变量“贴图名称_ST”,例:_MainTex_ST
ComputeScreenPos(float4 pos)计算顶点在屏幕空间的位置
float3 WorldSpaceViewDir(float4 v)输入顶点位置,输出世界空间下顶点到摄像机的方向
float3 UnityWorldSpaceViewDir(float4 v)输入一个世界顶点,输出世界空间下该点到摄像机的方向
float3 ObjSpaceViewDir(float4 v)输入顶点位置,输出模型空间下顶点到摄像机的方向
float3 WorldSpaceLightDir(float4 v)仅用于前向渲染,输入顶点位置,输出世界空间下顶点到光源的方向
float3 UnityWorldSpaceLightDir(float4 v)仅用于前向渲染,输入一个世界坐标,输出世界空间下该点到光源的方向
float3 ObjSpaceLightDir(float4 v)仅用于前向渲染,输入顶点位置,输出模型空间下顶点到光源的方向
float3 UnityObjectToWorldNormal(float3 norm)将法线方向从模型空间转换到世界空间
float3 UnityObjectToWorldDir(in float3 dir)将方向从模型空间转换到世界空间
float3 UnityWorldToObjectDir(float3 dir)将方向从世界空间转换到模型空间
SHADOW_COORDS(i)放在FrowardBase渲染路径下顶点函数的输出结构体中,需引用”AutoLight.cginc”,i是可用寄存器索引用于声明阴影纹理的坐标
TRANSFER_SHADOW(o)计算结果即为阴影纹理的坐标,o为输出结构体,需放在顶点函数中
SHADOW_ATTENUATION(i)计算阴影衰减值,需放在片元函数中,i为片元函数的输入结构体,即上式中的o注意:以上三个函数使用时,需保证顶点函数的输入结构体变量为v,结构体的顶点坐标为vertex,输出结构体中的顶点坐标为pos
float2 ParallaxOffset (half h, half height, half3 viewDir)为视差法线贴图计算UV偏移
fixed Luminance (fixed3 c)将颜色转换为亮度(灰度)
fixed3 DecodeLightmap (fixed4 color)从Unity光照贴图解码颜色(基于平台为RGBM 或dLDR)
float4 EncodeFloatRGBA (float v)为储存低精度的渲染目标,编码[0…1)范围的浮点数到RGBA颜色
float DecodeFloatRGBA (float4 enc)解码RGBA颜色到float
float2 EncodeFloatRG (float v)类似EncodeFloatRGBA
float DecodeFloatRG (float2 enc)类似DecodeFloatRGBA
float2 EncodeViewNormalStereo (float3 n)编码视图空间法线到在0到1范围的两个数
float3 DecodeViewNormalStereo (float4 enc4)从enc4.xy解码视图空间法线

Unity内置变量

内置变量都在UnityShaderVariables.cginc文件中声明

函数说明
UNITY_MATRIX_MVP将顶点/方向从模型空间转换到裁剪空间
UNITY_MATRIX_MV将顶点/方向从模型空间转换到观察空间
UNITY_MATRIX_V将顶点/方向从世界空间转换到观察空间
UNITY_MATRIX_P将顶点/方向从观察空间转换到裁剪空间
UNITY_MATRIX_VP将顶点/方向从世界空间转换到裁剪空间
UNITY_MATRIX_T_MVUNITY_MATRIX_MV的转置矩阵
UNITY_MATRIX_IT_MVUNITY_MATRIX_MV的逆转置矩阵,可将法线从模型空间转换到观察空间
_Object2World将顶点/方向从模型空间转换到世界空间,已修改为unity_ObjectToWorld
_World2Object将顶点/方向从世界空间转换到模型空间,已修改为unity_WorldToObject
_WorldSpaceCameraPos当前渲染的相机在世界空间中的位置
_ProjectionParamsx=1(-1),y=near,z=far,w=1+1/far,near和far是近远裁屏幕到相机的距离
_ScreenParamsx=width,y=height,z=1+1/width,w=1+1/height
_ZBufferParamsx=1-far/near,y=far/near,z=x/far,w=y/far
unity_OrthoParamsx=正交投影相机的宽度,y=正交投影相机的高度,z未定义,w=1(正交相机)/0(透视相机)
unity_CameraProjection该相机的投影矩阵
unity_CameraInvProjection该相机的投影矩阵的逆矩阵
unity_CameraWorldClipPlanes[6]该相机的6个裁剪屏幕在世界空间下的等式,存储顺序:左右下上近远
UNITY_LIGHTMODEL_AMBIENT前向渲染下的环境光信息
_LightColor0光源颜色
_WorldSpaceLightPos0光源方向(世界空间)
_LightMatrix0世界空间到光源空间的变换矩阵
unity_4LightPosX0仅用于ForwardBase,前4个非重要光源的世界空间下的x坐标
unity_4LightPosY0仅用于ForwardBase,前4个非重要光源的世界空间下的y坐标
unity_4LightPosZ0仅用于ForwardBase,前4个非重要光源的世界空间下的z坐标
unity_4LightAtten0仅用于ForwardBase,前4个非重要光源的衰减因子
unity_LightColor数组,仅用于ForwardBase,前4个非重要光源的颜色
_Timefloat4 是自该场景加载开始所经过的时间,4个分量分别是 (t/20, t, t2, t3)
_SinTimefloat4 是时间的正弦值,4个分量分别是 (t/8, t/4, t/2, t)
_CosTimefloat4 是时间的余弦值,4个分量分别是 (t/8, t/4, t/2, t)
unity_DeltaTimefloat4 是时间增量,4个分量的值分别是(dt, 1/dt, smoothDt, 1/smoothDt)
_CameraDepthTexture深度纹理,使用SAMPLE_DEPTH_TEXTURE函数获取深度值,使用Linear01Depth线性化深度值
_CameraDepthNormalsTexture深度法线纹理,使用DecodeViewNormalStereo(tex2D(_CameraDepthNormalsTexture,i.uv).xy)获取[-1,1]之间的法线值
unity_SpecCube0天空盒贴图
unity_SpecCube0_HDR用来解码天空盒颜色:DecodeHDR(UNITY_SAMPLE_TEXCUBE(unity_SpecCube0,i.worldRefl),unity_SpecCube0_HDR)

常用语义

从应用阶段传递模型数据给顶点着色器时

语义说明
POSITION模型空间中的顶点位置,通常是float4类型
NORMAL顶点法线,通常是float3类型(模型空间)
TANGENT顶点切线,通常是float4类型,第四个分量用于存储特殊数值
TEXCOORDn顶点纹理坐标,常是float2或float4。在Unity Model2和3中,n=8(默认),在4和5中n=16
COLOR顶点颜色,通常是fixed4或float4类型

从顶点着色器传递给片元着色器时

语义说明
SV_POSITION裁剪空间中的顶点坐标,结构体中必须包含一个用该语义的变量
COLOR0输出第一组顶点颜色,不必需
COLOR1输出第二组顶点颜色,不必需
TEXCOORD0~7输出纹理坐标,不必需

片元着色器输出

注意:一个语义可以使用的寄存器最多只能处理4个浮点值(float),因此对于4x4矩阵,需要拆分成4个float4类型的变量来存储矩阵数据

语义说明
SV_Target输出值将会存储到渲染目标(render target)中
VPOS屏幕坐标,x=ScreenWidth+0.5,y=ScreenHeight+0.5,z=[0(near),1(far)],w=1(正交投影)/1/near,1/far
WPOS同VPOS注:使用这两个语义定义的输入input可得到视口空间坐标:input.xy/_ScreenParams.xy另一种等价方法:顶点函数中用ComputeScreenPos计算屏幕空间坐标,再在片元函数中用结果srcPos.xy/srcPos.w

宏定义

说明
UNITY_UV_STARTS_AT_TOP判断当前平台是否DirectX,一半配合_MainTex_TexelSize.y(负数说明开启了抗锯齿)进行uv反转
USING_DIRECTIONAL_LIGHT判断是否使用平行光

CG函数

函数说明
abs计算输入值的绝对值
acos返回输入值反余弦值
all测试非0值
any测试输入值中的任何非零值
asin返回输入值的反正弦值
atan返回输入值的反正切值
atan2返回y/x的反正切值
ceil返回大于或等于输入值的最小整数
clamp把输入值限制在[min, max]范围内
clip如果输入向量中的任何元素小于0,则丢弃当前像素
cos返回输入值的余弦
cosh返回输入值的双曲余弦
cross返回两个3D向量的叉积
ddx返回关于屏幕坐标x轴的偏导数
ddy返回关于屏幕坐标y轴的偏导数
degrees弧度到角度的转换
determinant返回输入矩阵的值
distance返回两个输入点间的距离
dot返回两个向量的点积
exp返回以e为底数,输入值为指数的指数函数值
exp2返回以2为底数,输入值为指数的指数函数值
faceforward检测多边形是否位于正面
floor返回小于等于x的最大整数
fmod(x,y)返回 x/y 的浮点余数。如果 y 为 0,结果不可预料
step(a,x)如果 x<a,返回 0;否则,返回 1
frac返回输入值的小数部分
frexp返回输入值的尾数和指数
fwidth返回 abs ( ddx (x) + abs ( ddy(x))
isfinite如果输入值为有限值则返回true,否则返回false
isinf如何输入值为无限的则返回true
isnan如果输入值为NAN或QNAN则返回true
ldexpfrexp的逆运算,返回 x * 2 ^ exp
len / length返回输入向量的长度
lerp对输入值进行插值计算
lit返回光照向量(环境光,漫反射光,镜面高光,1)
log返回以e为底的对数
log10返回以10为底的对数
log2返回以2为底的对数
max返回两个输入值中较大的一个
min返回两个输入值中较小的一个
modf把输入值分解为整数和小数部分
mul返回输入矩阵相乘的积
normalize返回规范化的向量,定义为 x / length(x)
pow返回输入值的指定次幂
radians角度到弧度的转换
reflect返回入射光线i对表面法线n的反射光线
refract返回在入射光线i,表面法线n,折射率为eta下的折射光线v
round返回最接近于输入值的整数
rsqrt返回输入值平方根的倒数
saturate把输入值限制到[0, 1]之间
sign计算输入值的符号
sin计算输入值的正弦值
sincos返回输入值的正弦和余弦值
sinh返回x的双曲正弦
smoothstep返回一个在输入值之间平稳变化的插值
sqrt返回输入值的平方根
tan返回输入值的正切值
fanh返回输入值的双曲线切线
transpose返回输入矩阵的转置
tex1D*1D纹理查询
tex2D*2D纹理查询
tex3D*3D纹理查询
texCUBE*立方纹理查询

几条建议

  1. 不鼓励在 Shader 中使用流程控制语句(if-else,for,while等),因为会降低 GPU 的并行处理效率
  2. 把片段着色器上的计算放到顶点着色器中,或者在 CPU 中进行预计算
  3. 分支判断语句的条件最好是常量
  4. 每个分支中的操作尽可能少
  5. 分支嵌套尽可能少
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值