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值。


  缺省雾设定基于渲染设置。
  开启雾效通经常使用于优化性能。雾能够让远处的物体淡出而不进行绘制。
  不要低估细致调整渲染设置后为游戏带来的视觉冲击力。
  渲染设置是针对每一个场景的,每一个场景都能够有不同的渲染设置。



转载于:https://www.cnblogs.com/zhchoutai/p/8455722.html

### HDRP Shader语法规则概述 HDRP(High Definition Render Pipeline)是一种高级渲染管线,专为高质量视觉效果设计。其Shader语法相较于传统Unity Shader有一些独特之处,主要体现在对材质属性的支持、光照模型的定义以及性能优化方面。 #### 1. **HDRP Shader 的基本结构** HDRP Shader 文件通常由 `SubShader` 和 `Pass` 组成,其中每个 Pass 定义了一种特定的渲染行为。HDRP 中引入了新的标签和关键字,这些内容主要用于指定渲染队列、混合模式以及其他渲染特性[^2]。 ```hlsl Shader "Custom/HDRPExample" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderPipeline"="HDRenderPipeline" "RenderType"="Opaque" } Pass { HLSLPROGRAM #pragma vertex vert #pragma fragment frag // Include necessary files for HD rendering #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/Core.hlsl" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; v2f vert(appdata v) { v2f o; o.vertex = TransformObjectToHDClip(v.vertex); o.uv = v.uv; return o; } half4 frag(v2f i) : SV_Target { half4 col = tex2D(_MainTex, i.uv); return col; } ENDHLSL } } } ``` 上述代码展示了如何创建一个简单的 HDRP Shader。注意以下几点: - 使用了 `TransformObjectToHDClip` 函数来进行坐标转换[^1]。 - 包含了 HDRP 特定的核心库文件 `Core.hlsl`,这提供了许多预定义函数和支持[^3]。 --- #### 2. **HDRP Shader 的核心概念** ##### (1)**Material Attributes** HDRP 支持多种材质属性,例如 Base Color、Specular、Metallic 等。这些属性可以通过 `Properties` 块进行声明并映射到材质编辑器中。 ##### (2)**Lighting Model** HDRP 提供了 PBR(Physically Based Rendering)光照模型支持,默认情况下会应用基于物理特性的反射率计算方法。开发者也可以自定义光照模型以满足特殊需求。 ##### (3)**Tags and Keywords** 为了兼容 HDRP 渲染管线,在编写 Shader 时需设置 `"RenderPipeline"` 标签为 `"HDRenderPipeline"`。此外还可以通过关键词控制不同的渲染路径或状态。 --- #### 3. **推荐的学习资源与工具** 对于初学者来说,除了掌握基础语法外,还需要熟悉 Unity 官方文档中的相关内容。以下是几个重要的参考资料: - **官方文档**: [Unity HDRP Documentation](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest/) - **Shader Graph 工具**: 自 Unity 2018.1 起推出的可视化 Shader 编辑器能够显著降低入门门槛。 如果倾向于手动编码,则建议阅读有关 HLSL 的书籍或者在线教程,因为大部分现代图形编程都依赖于这种语言。 --- #### 4. **常见注意事项** - 在开发过程中要特别留意性能问题,尤其是当项目规模较大时。合理配置纹理分辨率、减少不必要的计算操作都是提高效率的有效手段。 - 测试阶段应充分考虑目标平台硬件能力差异带来的影响。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值