Shader基础

参考文章:Unity着色器介绍

Shader基础

Properties

声明格式

  • [optional: attribute] name(“display text in Inspector”, type name) = default value

属性类型

  • Color:颜色属性,表示 RGBA 颜色值。
  • Range:范围属性,表示一个在指定范围内的浮点数值。
  • Float:浮点数属性,表示一个浮点数值。
  • Int(旧) Integer(新):整数属性,表示一个整数值。
  • Vector:向量属性,表示一个二维或三维向量。
  • 2D:二维纹理属性,表示一个二维纹理。
  • Cube:立方体纹理属性,表示一个立方体纹理。
  • 3D:三维纹理属性,表示一个三维纹理。
  • 2DArray:二维纹理数组属性,表示一个二维纹理数组。
  • CubeArray:立方体纹理数组属性,表示一个立方体纹理数组。
  • Any:任意类型属性,表示一个支持的任意类型值。

属性特性

  • [HideInInspector] - 不在材质检视面板中显示属性值。
  • [NoScaleOffset] - 对于具有此特性的纹理属性,材质检视面板不会显示纹理平铺/偏移字段。
  • [Normal] - 表示纹理属性需要法线贴图。
  • [HDR] - 表示纹理属性需要高动态范围 (HDR) 纹理。
  • [Gamma] - 表示在 UI 中将浮点/矢量属性指定为 sRGB 值(就像颜色一样),并且可能需要根据使用的颜色空间进行转换。请参阅着色器程序中的属性。
  • [PerRendererData] - 表示纹理属性将以 MaterialPropertyBlock 的形式来自每渲染器数据。材质检视面板会更改这些属性的纹理字段 UI。
  • [MainTexture] 设置材质的主纹理
  • [MainColor] 设置材质的主颜色

SubShader

描述:子着色器允许您将着色器对象分离为与不同硬件、渲染管线和运行时设置兼容的部分。
子着色器包含:

  • 有关此子着色器与哪些硬件、渲染管线和运行时设置兼容的信息
  • 子着色器标记,它们是键值对,提供有关子着色器的信息
  • 一张或多张Pass

格式

SubShader
{
    <optional: LOD>
    <optional: tags>
    <optional: commands>
    <One or more Pass definitions>
}

Tags

格式

Tags { “[name1]” = “[value1]” “[name2]” = “[value2]”}

类型

  • Queue tag

    • 描述:该标签告诉 Unity 要将其渲染的几何体用于哪个渲染队列。渲染队列是决定 Unity 渲染几何体顺序的因素之一

    • SignatureFunction
      “Queue” = “[queue name]”使用命名的渲染队列
      “Queue” = “[queue name] + [offset]”使用与命名队列有给定偏移量的未命名队列。这有用的一个例子是透明水,您应该在不透明对象之后但在透明对象之前绘制它
    • SignatureValue (类型)Function
      [queue name]Background指定后台呈现队列
      Geometry指定几何体渲染队列
      AlphaTest指定 AlphaTest 呈现队列
      Transparent指定透明呈现队列
      Overlay指定叠加呈现队列
      [offset]integer指定 Unity 相对于命名队列呈现未命名队列的索引
  • RenderPipeline tag

    • 描述:该标签告诉 Unity 子着色器是否与通用渲染管线 (URP) 或高清渲染管线 (HDRP) 兼容
    • SignatureValue (类型)Function
      [name]UniversalRenderPipelineThis SubShader is compatible with URP only.
      HighDefinitionRenderPipelineThis SubShader is compatible with HDRP only.
      (any other value, or not declared)This SubShader is not compatible with URP or HDRP.
    • eg:Tags { "RenderPipeline" = "UniversalRenderPipeline" }

(any other value, or not declared) This SubShader is not compatible with URP or HDRP.

  • RenderType tag

    • 描述:使用该标记覆盖着色器对象的行为。
    • 类型
      • Opaque: 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。
      • Transparent:用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器)。
      • TransparentCutout: 蒙皮透明着色器(Transparent Cutout,两个通道的植被着色器)。
      • Background: Skybox shaders. 天空盒着色器。
      • Overlay: GUITexture, Halo, Flare shaders. 光晕着色器、闪光着色器。
      • TreeOpaque: terrain engine tree bark. 地形引擎中的树皮。
      • TreeTransparentCutout: terrain engine tree leaves. 地形引擎中的树叶。
      • TreeBillboard: terrain engine billboarded trees. 地形引擎中的广告牌树。
      • Grass: terrain engine grass. 地形引擎中的草。
      • GrassBillboard: terrain engine billboarded grass. 地形引擎何中的广告牌草。
    • SignatureFunction
      “RenderType” = “[renderType]”B使设置此子着色器的渲染类型值用命名的渲染队列
  • ForceNoShadowCasting tag

    • 描述:该标签可防止子着色器中的几何体投射(有时接收)阴影。确切的行为取决于渲染管线和ForceNoShadowCasting渲染路径
    • 类型
      • True
      • False
  • DisableBatching tag

    • 描述:标签用于指定当前渲染状态不支持批处理。当一个对象使用具有相同材质的 Mesh 渲染时,Unity 会尝试将它们合并为一个批次进行渲染,以减少渲染调用的数量,提高渲染性能。但是在某些情况下,批处理会导致渲染结果出错或性能下降,此时可以使用 DisableBatching 标签来禁用批处理.
    • 类型
      • True
      • False
  • IgnoreProjector tag

    • 描述:标签用于指定当前渲染状态不受投影机的影响。当一个场景中包含有一个或多个投影机时,投影机会将场景中的对象投射到相应的投影面上,形成投影效果。但是在某些情况下,需要禁用某些对象的投影效果,例如天空盒、水面等,此时可以使用 IgnoreProjector 标签来指定不受投影机的影响.
    • 类型
      • True
      • False
  • PreviewType tag

    • 描述:标签用于指定在 Shader Inspector 面板中显示 Shader 预览图的类型。当使用自定义 Shader 开发时,可以使用 PreviewType 标签来指定在 Shader Inspector 面板中显示预览图的方式,以方便开发者对 Shader 效果进行调试和预览。
    • 类型
      • Sphere
      • Plane
      • Skybox
  • CanUseSpriteAtlas tag

    • 描述:在使用旧版精灵打包器的项目中使用此 SubShader 标签来警告用户着色器依赖于原始纹理坐标,因此他们不应将其纹理打包到图集中。
    • 类型
      • True
      • False

LOD

描述:使用此技术可以微调不同硬件上的着色器性能。当 SubShader 理论上由用户的硬件支持,但硬件无法很好地运行它时,这很有用.Unity优先考虑值较低的子着色器.

顺序:当 Unity 首次使用着色器对象渲染几何体时,或者当着色器 LOD 值或活动渲染管线更改时:
Unity 遍历所有子着色器的列表并检查它们以确定它们是否:与设备硬件兼容;等于或低于当前着色器详细位置价值;并与活动渲染管线兼容。

  • 如果列表包含一个或多个满足这些要求的子着色器,则会选择第一个子着色器。这是活动的子着色器。
  • 如果列表不包含任何满足所有要求的子着色器:
    • 如果列表包含一个或多个满足硬件要求(但不满足 LOD 或渲染管线要求)的子着色器,Unity 将选择第一个子着色器。这是活动的子着色器。
    • 如果列表中不包含任何满足硬件要求的子着色器,Unity 将显示错误着色器。
  • 在这里插入图片描述

  • eg:LOD 200

Pass

描述:一个Pass包含:

  • 标签,它们是键值对,提供有关Pass的信息
  • 在运行着色器程序之前更新渲染状态的说明
  • 着色器程序,组织成一个或多个着色器变体

格式

Pass
{
    <optional: name>
 	<optional: tags>
    <optional: commands>
    <optional: shader code>
}
  1. 指定名字:Name "<name>"
    • eg : Name "ExampleNamedPass"
  2. 分配标签:LightModeTags和Tags block
  3. 命令:
    • AlphaToMask: 是一种用于深度测试和抗锯齿的技术,通常用于半透明物体的渲染.
    • Blend: 启用和配置 Alpha 混合.
    • BlendOp: 设置混合命令使用的操作.
    • ColorMask: 设置颜色通道写入蒙版 .
    • Conservative: 启用和禁用保守光栅化.
    • Cull:设置多边形剔除模式.
    • Offset: 设置多边形深度偏移.
    • Stencil: 配置模板测试,以及要写入的内容模板缓冲区.
    • ZClip: 设置深度剪辑模式.
    • ZTest: 设置深度测试模式.
    • ZWrite: 设置深度缓冲区写入模式
    • UsePass:减少重复性代码
    • GrabPass :抓取屏幕纹理

在这里插入图片描述

添加着色器块

  • cg
  • hlsl

指定包要求

  • 有多种方法可以声明包要求。每个都提供不同的行为。它们是:
    • “<包名称>”:指定子着色器或通道适用于包的任何版本。
    • “<包名称>”: “<版本限制>”:指定子着色器或通道仅适用于包版本的子集。
    • “<包名称>”: “unity=<版本限制>”:指定子着色器或通道仅适用于 Unity 版本的子集,并且需要 具有给定名称的包。
    • “unity”:“<版本限制>”:指定子着色器或通道仅适用于 Unity 版本的子集。
  •         PackageRequirements
          {
              "com.unity.render-pipelines.universal": "[10.2.1,11.0]"
              "com.unity.textmeshpro": "3.2"
          }
    

例子

Pass{                
          Name "ExamplePassName"
          Tags { "ExampleTagKey" = "ExampleTagValue" }

          // ShaderLab commands go here.

          // HLSL code goes here.
    }

代码例子

简单的无光照着色器

Shader "Unlit/SimpleUnlitTexturedShader"
{
    Properties
    {
        // we have removed support for texture tiling/offset,
        // so make them not be displayed in material inspector
        [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            // use "vert" function as the vertex shader
            #pragma vertex vert
            // use "frag" function as the pixel (fragment) shader
            #pragma fragment frag

            // vertex shader inputs
            struct appdata
            {
                float4 vertex : POSITION; // vertex position
                float2 uv : TEXCOORD0; // texture coordinate
            };

            // vertex shader outputs ("vertex to fragment")
            struct v2f
            {
                float2 uv : TEXCOORD0; // texture coordinate
                float4 vertex : SV_POSITION; // clip space position
            };

            // vertex shader
            v2f vert (appdata v)
            {
                v2f o;
                // transform position to clip space
                // (multiply with model*view*projection matrix)
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                // just pass the texture coordinate
                o.uv = v.uv;
                return o;
            }
            
            // texture we will sample
            sampler2D _MainTex;

            // pixel shader; returns low precision ("fixed4" type)
            // color ("SV_Target" semantic)
            fixed4 frag (v2f i) : SV_Target
            {
                // sample texture and return it
                fixed4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/1594.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于微信小程序的校园二手交易平台小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…

22讲MySQL有哪些“饮鸩止渴”提高性能的方法

短连接风暴 是指数据库有很多链接之后只执行了几个语句就断开的客户端&#xff0c;然后我们知道数据库客户端和数据库每次连接不仅需要tcp的三次握手&#xff0c;而且还有mysql的鉴权操作都要占用很多服务器的资源。话虽如此但是如果连接的不多的话其实这点资源无所谓的。 但是…

Web自动化——前端基础知识(二)

1. Web前端开发三要素 web前端开发三要素 什么是HTMl&#xff1f; Html是超文本标记语言&#xff0c;是用来描述网页的一种标记语言HTML是一种标签规则的形式将内容呈现在浏览器中可以以任意编辑器创建&#xff0c;其文件扩展名为.html或.htm保存即可 什么是CSS&#xff1f;…

ElasticSearch-第五天

目录 es中脑裂问题 脑裂定义 脑裂过程分析 解决方案 数据建模 前言 nested object 父子关系数据建模 父子关系 设置 Mapping 索引父文档 索引子文档 Parent / Child 所支持的查询 使用 has_child 查询 使用 has_parent 查询 使用 parent_id 查询 访问子文档 …

学习 Python 之 Pygame 开发魂斗罗(一)

学习 Python 之 Pygame 开发魂斗罗&#xff08;一&#xff09;Pygame回忆Pygame1. 使用pygame创建窗口2. 设置窗口背景颜色3. 获取窗口中的事件4. 在窗口中展示图片(1). pygame中的直角坐标系(2). 展示图片(3). 给部分区域设置颜色5. 在窗口中显示文字6. 播放音乐7. 图片翻转与…

人脸活体检测系统(Python+YOLOv5深度学习模型+清新界面)

摘要&#xff1a;人脸活体检测系统利用视觉方法检测人脸活体对象&#xff0c;区分常见虚假人脸&#xff0c;以便后续人脸识别&#xff0c;提供系统界面记录活体与虚假人脸检测结果。本文详细介绍基于YOLOv5深度学习技术的人脸活体检测系统&#xff0c;在介绍算法原理的同时&…

【C++】用手搓的红黑树手搓set和map

目录 一、set/map的底层结构 1、set/map的源码 2、利用模板区分set/map 3、利用仿函数控制比较大小 二、set/map的迭代器&#xff08;红黑树的迭代器&#xff09; 1、红黑树的begin、end迭代器 2、红黑树迭代器的operator 3、红黑树迭代器的operator-- 三、set的const…

人工智能大模型之ChatGPT原理解析

前言 近几个月ChatGPT爆火出圈&#xff0c;一路狂飙&#xff1b;它功能十分强大&#xff0c;不仅能回答各种各样的问题&#xff0c;还可以信写作&#xff0c;给程序找bug…我经过一段时间的深度使用后&#xff0c;十分汗颜&#xff0c;"智障对话"体验相比&#xff0c…

Spring-Data-Redis 和 Redisson TLS/SSL 连接

先决条件已经部署好redis tls环境。如未部署好&#xff0c;可参考&#xff1a;Redis 6.0 Docker容器使用SSL/TLS已知redis tls环境使用的证书&#xff1a;其中&#xff1a;ca.crt :服务器证书ca.key:服务器私钥redis.crt:客户端证书redis.key:客户端私钥证书处理生成证书p12文件…

Linux环境C语言开发基础

C语言是一门面向过程的计算机编程语言&#xff0c;与C、C#、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言诞生于美国的贝尔实验室&#xff0c;由丹…

信创办公–基于WPS的PPT最佳实践系列(表格和图标常用动画)

信创办公–基于WPS的PPT最佳实践系列&#xff08;表格和图标常用动画&#xff09; 目录应用背景操作步骤图表常用动画效果&#xff1a;擦除效果表格常用动画效果&#xff1a;轮子效果应用背景 文不如表&#xff0c;表不如图。在平时用ppt做总结时&#xff0c;我们会经常用到图…

手撕数据结构与算法——树(三指针描述一棵树)

&#x1f3c6;作者主页&#xff1a;king&南星 &#x1f384;专栏链接&#xff1a;数据结构 &#x1f3c5;文章目录&#x1f331;树一、&#x1f332;概念与定义二、&#x1f333;定义与预备三、&#x1f334;创建结点函数四、&#x1f340;查找五、&#x1f341;插入六、&a…

SpringBoot接口 - 如何生成接口文档之Swagger技术栈

SpringBoot开发Restful接口&#xff0c;有什么API规范吗&#xff1f;如何快速生成API文档呢&#xff1f;Swagger 是一个用于生成、描述和调用 RESTful 接口的 Web 服务。通俗的来讲&#xff0c;Swagger 就是将项目中所有&#xff08;想要暴露的&#xff09;接口展现在页面上&am…

我的创作纪念日——一年的时间可以改变很多

机缘 不知不觉来到CSDN已经创作一年了。打心底讲&#xff0c;对于在CSDN开始坚持创作的原因我用一句话来概括最合适不过了——“无心插柳柳成荫” 为什么这么说呢&#xff1f; 这要从我的一篇博客说起——《输入命令Javac报错详解》&#xff1a; 那也是我第一次接触到Java这…

PostMan工具的使用

PostMan工具的使用 1 PostMan简介 代码编写完后&#xff0c;我们要想测试&#xff0c;只需要打开浏览器直接输入地址发送请求即可。发送的是GET请求可以直接使用浏览器&#xff0c;但是如果要发送的是POST请求呢? 如果要求发送的是post请求&#xff0c;我们就得准备页面在页…

基于OpenCV的传统视觉应用 -- OpenCV图像处理 图像模糊处理 图像锐化处理

图像处理 图像处理是用计算机对图像进行分析&#xff0c;以获取所需结果的过程&#xff0c;又称为影像处理。图像处理一般是指数字图像的处理。数字图像是用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组&#xff0c;该数组的元素称为像素&#xff0c;其值称…

C++造轮子飙车现场之无锁、有锁环形队列实现

先看带锁的实现。 带锁版本 circular_queue.h // 头文件防卫 #ifndef CIRCULAR_QUEUE_H #define CIRCULAR_QUEUE_H#include <mutex> // 互斥量 #include <condition_variable> // 条件变量template <typename T> class CircularQueue { public:// 构造函数…

公司测试员用例写得乱七八糟,测试总监制定了这份《测试用例编写规范》

统一测试用例编写的规范&#xff0c;为测试设计人员提供测试用例编写的指导&#xff0c;提高编写的测试用例的可读性&#xff0c;可执行性、合理性。为测试执行人员更好执行测试&#xff0c;提高测试效率&#xff0c;最终提高公司整个产品的质量。 一、范围 适用于集成测试用…

vue3 项目搭建教程(基于create-vue,vite,Vite + Vue)

vue3 项目搭建教程&#xff08;基于create-vue&#xff0c;vite&#xff0c;Vite Vue&#xff09; 目录 一、搭建vue3 项目前提条件 二、通过create-vue搭建vue3 项目 三、搭建一个 Vite 项目 四、构建一个 Vite Vue 项目 五、打开Vue 项目管理器 六、Vite Vue 项目目…

云开发--实现发送邮件+短信+链接跳转小程序功能

目录 1、小程序实现发送邮件 准备一个qq邮箱&#xff0c;并启动SMTP服务 确定小程序云开发环境&#xff0c;并新建云函数 2、小程序实现发送短信 确定应用 确定签名 确定模板 编写云函数-发送短信 3、链接跳转小程序 H5 配置 生成 URL Link 学习记录&#xff1a; …