Shader的语法

Shader的语法

Shader "name" { [Properties] Subshaders [Fallback] }
(1)Properties:{ Property [Property ...] } 
  属性列表,如color、texture、float等。
  name ("display name", Range (min, max)) = number
  name ("display name", Color) = (number,number,number,number)
  name ("display name", 2D) = "name" { options } 定义2D纹理属性
  name ("display name", Rect) = "name" { options } 定义长方形(非2次方)纹理属性
  name ("display name", Cube) = "name" { options }
  name ("display name", Float) = number
  name ("display name", Vector) = (number,number,number,number)
  在Unity中, name通常使用下划线开始的命名方式。
  在着色器中,属性值通过[name]来访问对应的属性。
  texture的大括号中可以设置:TexGen(ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal)、LightmapMode。


Properties {
    // properties for water shader
    // 水着色器的属性
    _WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders
    _ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5
    _RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4
    _RefrColor ("Refraction color", Color)  = (.34, .85, .92, 1) // color
    _ReflectionTex ("Environment Reflection", 2D) = "" {TexGen EyeLinear} // textures
    _RefractionTex ("Environment Refraction", 2D) = "" {}
    _Fresnel ("Fresnel (A) ", 2D) = "" {}
    _BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}

(2)Subshaders:Subshader { [Tags] [CommonState] Passdef [Passdef ...] }
  至少有一个,当加载一个着色器时,Unity将遍历这个列表,获取第一个能被用户机器支持的着色器。
(2.1)Tags:Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
  渲染排序队列Rendering Order - Queue tag,eg:"Queue" = "Transparent"
  有四种预定义的渲染队列,在预定义队列之间还可以定义更多队列:
  Background:1000,后台,天空盒
  Geometry (default):2000,不透明的物体

  Alpha Test:2450
  Transparent:3000,透明,所有的alphe blend
  Overlay:4000,覆盖,任何需要最后渲染的对象应该放置在此处,如镜头光晕
  忽略投影标签:"IgnoreProjector" = "True"
  如果设置忽略投影标签为"True",那么使用这个着色器的对象将不会被投影机所影响。对半透明的物体来说最有用处,因为没有对他们产生投影的好办法。

  如果设置忽略投影标签为"True",那么使用这个着色器的对象将不会被投影机所影响。对半透明的物体来说最有用处,因为没有对他们产生投影的好办法。

  ForceNoShadowCasting,值为"true"时,表示不接受阴影。
  RenderType标签:Unity可以运行时替换符合特定RenderType的所有Shader。Camera.RenderWithShader或者Camera.SetReplacementShader配合使用。Unity内置的RenderType包括:
  Opaque:绝大部分不透明的物体都使用这个;
  Transparent:绝大部分透明的物体、包括粒子特效都使用这个;
  Background:天空盒都使用这个;
  Overlay:GUI、镜头光晕都使用这个;

Shader "Transparent Queue Example" {
     SubShader {
        Tags {"Queue" = "Transparent" "RenderType" = "Opaque"}
        Pass {
            // rest of the shader body...
        }
    }
}

(2.2)Pass:Pass { [Name and Tags] [RenderSetup] [TextureSetup] }
  一个pass代表一次渲染过程
(2.2.1)Name:一个通道能被赋予一个名字以便UsePass 命令能索引到它,所有通道名字都是大写开头。
(2.2.2)Tags:Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
  LightMode光照模式标签:Always,ForwardBase,ForwardAdd,PrepassBase,PrepassFinal,Vertex,VertexLMRGBM,VertexLM,ShadowCaster,ShadowCollector
  RequireOptions需要选项标签:当一些外部条件得到满足时 这个pass才渲染,这是通过使用RequireOptions标签,它的值是一个空格分割的字符串,目前由Unity3d支持的选项是:SoftVegetation
(2.2.3)Render Setup渲染设置
  Material { Material Block } 定义一个使用顶点光照管线的材质:Diffuse Ambient Specular Shininess Emission(自发光颜色,当不被任何光照所照到时,对象的颜色) 
  Lighting On | Off 开启或关闭顶点光照
  Cull Back | Front | Off 剔除模式
  ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) 深度测试模式
  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 颜色写遮罩。设置为0将关闭所有颜色通道的渲染
  Offset OffsetFactor , OffsetUnits 深度偏移
  SeparateSpecular On | Off 开启或关闭顶点光照相关的平行高光颜色,这个命令会添加高光光照到着色器通道的末尾,因此贴图对高光没有影响。只在光照开启时有效。
  ColorMaterial AmbientAndDiffuse | Emission 当计算顶点光照时使用每顶点颜色
(2.2.4)Texture Setup纹理设置 SetTexture texture property { [Combine options] }
  在完成渲染设定后,你能指定一定数量的纹理和当使用 SetTexture 命令时所采用的混合模式,
  纹理设置配置了固定函数多纹理管线,当使用自定义fragment shaders时,将忽略这个设置。
(2.3)UsePass:UsePass "Shader/Name"
  使用来自另一个着色器的命名通道,只有命名了的Pass才能被引用。
(2.4)GrabPass:有两种语法: 
  GrabPass { } 
  能捕获当前屏幕的内容到一个纹理中。纹理能在后续通道中通过 _GrabTexture 进行访问。
  GrabPass { "TextureName" }

(3)Fallback:如果没有子着色器被支持,Unity将尝试使用Fallback制定的着色器(降级shader)。

(4)Category:用于设置所有SubShader都会继承的渲染状态,效果和直接复制粘贴到每个subshader中一样。

Shader "example" {
Category {
    Fog { Mode Off }
    Blend One One
    SubShader {
        // ...
    }
    SubShader {
        // ...
    }
    // ...
}
}

(5)RenderSetting渲染设置,可以设置fog参数、环境光参数等。
  fog的参数:模式Mode Off | Global | Linear | Exp | Exp2,颜色Color ColorValue,强度Density FloatValue,范围Range FloatValue , FloatValue
  雾化是通过混合已生成的像素的颜色和基于到镜头的距离来确定的一个不变色来完成。雾化不会改变已经混合的像素的透明度值,只是改变RGB值。
  缺省雾设定基于渲染设置。
  开启雾效通常用于优化性能,雾可以让远处的物体淡出而不进行绘制。
  不要低估仔细调整渲染设置后为游戏带来的视觉冲击力。
  渲染设置是针对每个场景的,每个场景都可以有不同的渲染设置。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity GUP Shader语法是一种用于编写GPU着色器的语言。它基于HLSL语言,并添加了一些特殊的语法和功能,以便在Unity游戏引擎中使用。以下是一些常见的Unity GUP Shader语法: 1. Shader关键字:在着色器文件的开头,使用“Shader”关键字定义一个新的着色器。 2. Properties关键字:使用“Properties”关键字定义着色器的属性。这些属性可以在Unity编辑器中进行调整。 3. SubShader关键字:在着色器文件中,使用“SubShader”关键字定义一个新的子着色器。 4. Pass关键字:在子着色器中,使用“Pass”关键字定义一个新的渲染通道。 5. CGPROGRAM和ENDCG:在Pass中,使用“CGPROGRAM”和“ENDCG”来定义着色器代码块。 6. VertexShader和FragmentShader:在CGPROGRAM块中,使用“VertexShader”和“FragmentShader”来定义顶点着色器和片段着色器。 7. Input和Output结构体:在顶点着色器中,使用“Input”结构体定义输入数据,如顶点位置和法线。在片段着色器中,使用“Output”结构体定义输出数据,如颜色和深度。 8. UNITY_INSTANCING_BUFFER_START和UNITY_INSTANCING_BUFFER_END:在顶点着色器中,使用这些宏来启用Unity实例化功能,并访问实例化缓冲区。 9. UNITY_VERTEX_INPUT_INSTANCE_ID:在顶点着色器中,使用这个宏来获取当前实例的ID。 10. UNITY_ACCESS_INSTANCED_PROPERTY:在顶点着色器中,使用这个宏来访问实例化属性。 以上是一些常见的Unity GUP Shader语法。了解这些语法可以帮助您编写更高效和更强大的GPU着色器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值