UnityShader——06UnityShader介绍

news2024/11/25 1:01:50

UnityShader介绍

UnityShader的基础ShaderLab
在这里插入图片描述

UnityShader属性块介绍

Properties
{
    //和public变量一样会显示在Unity的inspector面板上
    //_MainTex为变量名,在属性里的变量一般会加下划线,来区分参数变量和临时变量
    //Texture为变量命名
    //2D为类型,为2D图片
    //"white"为默认值,默认为白色
    _MainTex ("Texture", 2D) = "white" {}

    //除了_MainTex以外,还有一些基本类型,比如:
    _Int("Int",int) = 2
    _Float("Float",float) = 1.5
    _Range("Range",range(0.0,2.0) = 1.0
    _Color("Color",Color) = (0,0,0,0)
    _Vector("Vector",Vector) = (0,0,0,0)
    _Cube("Cube",Cube) = "white"{}
    _3D("3D",3D) = "black"{}
}

UnityShader SubShader块介绍

一个Unity Shader文件可以包含很多个SubShader块,当Unity加载Shader的时候,它会扫描所有的SubShader块,选择第一个能在目标平台运行的SubShader

SubShader
{
    //标签可选写或不写 key = value
    Tags 
    { 
        //渲染顺序
        "Queue" = "Transparent"
        //渲染类型 着色器替换功能
        "RenderType"="Opaque"
        //是否进行合批
        "DisableBatching" = "True"
        //是否投射阴影
        "forceNoShadowCasting" = "True"
        //是否收Projector的影响,通常用于透明物体
        "IgnoreProjector" = "True"
        //是否用于图片的Shader,通常用于UI
        "CanUseSpriteAltas" = "False"
        //用作Shader面板预览的类型
        "PreviewType" = "Plane"
    }

    //Render渲染设置 可选写或不写
    //Cull 裁剪,选择渲染哪个面,默认值为只渲染正面
    //Cull off的话就是正反两面都进行渲染
    //Cull back的话就是只渲染正面
    //Cull front的话就是只渲染背面
    Cull off//back/front

    //ZTest 深度测试, 默认小于等于
    ZTest Always//Less Greater/Lequal/GEqual/Equal/NotEqual

    //Zwrite 深度写入,默认为打开
    Zwrite off//on

    //Blend 混合 格式如下
    //Blend SrcFactor DstFactor

    //不同情况下使用不同的LOD达到性能提升
    LOD 100

    //必须要写
    //SubShader里面可以有多个Pass通道,多个Pass通道是按顺序进行渲染的
    //不建议写多个通道,每多一个Pass通道,渲染的DrawCall就多一个,会降低性能
    Pass
    {
        //Pass通道名称,在外部可以直接Use这个通道,相当于函数,但是Use的时候Name必须全部大写
        Name "Default"

        //可以在通道里面书写标签,当通道内外都存在标签,执行的是外面的标签
        Tags
        {
            //定义该Pass通道在Unity渲染流水中的角色
            "LightMode" = "ForwardBase"

            //满足某些条件时才渲染该Pass通道
            "RequireOptions" = "SoftVegetation"
        } 
            
        //Render渲染设置 可以在通道里面书写渲染设置,当通道内外都存在渲染设置,执行的是外面的渲染设置

        //CG语言所写的代码,主要是顶点,片源,着色器
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        // make fog work
        #pragma multi_compile_fog

        #include "UnityCG.cginc"

        struct appdata
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
        };

        struct v2f
        {
            float2 uv : TEXCOORD0;
            UNITY_FOG_COORDS(1)
            float4 vertex : SV_POSITION;
        };

        sampler2D _MainTex;
        float4 _MainTex_ST;

        v2f vert (appdata v)
        {
            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            o.uv = TRANSFORM_TEX(v.uv, _MainTex);
            UNITY_TRANSFER_FOG(o,o.vertex);
            return o;
        }

        fixed4 frag (v2f i) : SV_Target
        {
            // sample the texture
            fixed4 col = tex2D(_MainTex, i.uv);
            // apply fog
            UNITY_APPLY_FOG(i.fogCoord, col);
            return col;
        }
        ENDCG
    }
}

注意

Unity Shader ≠ \neq = 真正的Shader

  • Unity Shader实际上指的就是一个ShaderLab文件。以.shader作为后缀的一种文件。在Unity shader里面,我们可以做的事情远多于一个传统意义上的Shader。
  • 在传统的shader中,我们仅可以编写特定类型的Shader,例如顶点着色器,片元着色器等。在Unity Shader中,我们可以在同一个文件里面同时包含需要的顶点着色器和片元着色器代码。
  • 在传统shader中,我们无法设置一些渲染设置,例如是否开启混合,深度测试等,这些是开发者在另外的代码中自行设置的。而Unity shader中,我们通过一行特定的指令就可以完成这些设置。
  • 在传统shader中,我们需要编写冗长的代码设置着色器的输入和输出,要小心的处理这些输入输出的位置对应关系等。而在Unity shader中,我们只需要在特定语句块中声明一些属性,就可以依靠材质来方便的改变这些属性。而对于模型自带的数据(如顶点,纹理坐标,法线等),Unity Shader也提供了直接访问的方法,不需要开发者自行编码来传给着色器。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务学习Day4

文章目录 初始MQ同步通讯和异步通讯MQ常见技术介绍 RabbitMQ快速入门入门案例 SpringAMQP介绍例子WorkQueue模型exchange交换机消息转换器 初始MQ 同步通讯和异步通讯 MQ常见技术介绍 RabbitMQ快速入门 入门案例 SpringAMQP 介绍 例子 WorkQueue模型 exchange交换机 消息转换…

二进制和进制转换

前言 我们经常能听到2进制、8进制、10进制、16进制这样的讲法,那是什么意思呢?其实2进制、8进 制、10进制、16进制是数值的不同表示形式而已。 比如:数值15的各种进制的表示形式: 15的2进制:111115的8进制&#xff1…

最小生成树(习题)

拆地毯 这个就是套用最小生成树的模板&#xff0c;只不过要将sort函数改成从大到小进行排序。然后这个退出条件是只要大于k就退出。 代码如下 #include<iostream> #include<cmath> #include<algorithm> #define N 1009000 using namespace std; int n,m,k…

HarmonyOS—状态管理概述

在前文的描述中&#xff0c;我们构建的页面多为静态界面。如果希望构建一个动态的、有交互的界面&#xff0c;就需要引入“状态”的概念。 图1 效果图 上面的示例中&#xff0c;用户与应用程序的交互触发了文本状态变更&#xff0c;状态变更引起了UI渲染&#xff0c;UI从“He…

【杂谈】裁我?我是研发,我是研发啊!

闲谈 这两年互联网是越来越不太平了&#xff0c;前有国外互联网裁员的妖风四起&#xff0c;后来寒气又传到国内&#xff0c;让我们这群打工人叫苦连天。最近有部电影蛮火的&#xff0c;叫《年会不能停》&#xff0c;感觉跟我前司很相似&#xff0c;不过好像由于今年业绩不太行…

解决LeetCode编译器报错的技巧:正确处理位操作中的数据类型

一天我在leetcode上刷题时&#xff0c;遇到了这样的题目&#xff1a; 随即我写了如下的代码&#xff1a; int convertInteger(int A, int B) {int count 0;int C A ^ B;int flag 1;while(flag){if (C & flag){count;}flag<<1;}return count;} 但LeetCode显示如下…

you-get,一个超强的 Python 库

你好&#xff0c;我是坚持分享干货的 EarlGrey&#xff0c;翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。 如果我的分享对你有帮助&#xff0c;请关注我&#xff0c;一起向上进击。 现在在线视频超火爆&#xff0c;可是我还是更倾向于将视频下载至本地…

文件上传漏洞--Upload-labs--Pass03--特殊后缀与::$DATA绕过

方法一&#xff1a;特殊后缀绕过&#xff1a; 一、什么是特殊后缀绕过 源代码中的黑名单禁止一系列后缀名 之外的后缀&#xff0c;称之为‘特殊后缀名’&#xff0c;利用其来绕过黑名单&#xff0c;达到上传含有恶意代码的文件的目的。 二、代码审计 接下来对代码逐条拆解进行…

【IO流】32.IO流

IO流 1. IO流1.1 概述1.2 作用1.3 分类1.4 注意事项 1. IO流 IO流&#xff1a;存储和读取数据的解决方案。 I&#xff1a;input O&#xff1a;output 流&#xff1a;像水流一样传输数据 1.1 概述 IO&#xff08;Input/Output&#xff09;流是计算机程序用于与外部设备进行数据…

CSS之margin塌陷

margin塌陷 CSS中的外边距塌陷&#xff08;Margin Collapse&#xff09;问题是指在垂直方向上&#xff0c;当两个或多个块级元素的边距相遇时&#xff0c;它们之间的距离不是它们各自边距的总和&#xff0c;而是其中的最大值。这种现象主要出现在块级元素的上下外边距之间。 &…

【测试】测试用例篇

目 录 一. 设计测试用例的万能公式(六个)二.设计测试用例的具体方法1.等价类2.边界值3.因果图&#xff08;判定表&#xff09;4.场景设计法5.正交法6.错误猜测法 一. 设计测试用例的万能公式(六个) 设计测试用例的万能公式 测试用例的意义是帮助测试人员了解&#xff1a;测什…

智慧公厕适合的场合

智慧公厕是以现代科技手段为基础&#xff0c;融合智能化、信息化和人性化设计的公共厕所&#xff0c;旨在提供更舒适、更便捷的如厕体验。智慧公厕适用于各种场合&#xff0c;包括城市公共厕所、旅游景区公共厕所、美丽乡村公共厕所、机场公共厕所、高铁和火车站公共厕所、高速…

el-upload组件的简单使用

最近公司的一个二期项目&#xff0c;开始要求复刻原有一期的功能页面。原先一期又不打算继续维护了&#xff0c;源码都没有。页面基本都涉及到了文件上传&#xff0c;以前很少使用到这个组件&#xff0c;公司有现成的表单设计器&#xff0c;文件上传都在组件里面拖动上传。在这…

w28DVWA-csrf实例

DVWA-csrf实例 low级别 修改密码&#xff1a;修改的密码通过get请求&#xff0c;暴露在url上。 写一个简单的html文件&#xff0c;里面伪装修改密码的文字&#xff0c;代码如下&#xff1a; <html><body><a href"http://dvwa:7001/vulnerabilities/csr…

浅谈语义分割、图像分类与目标检测中的TP、TN、FP、FN

语义分割 TP&#xff1a;正确地预测出了正类&#xff0c;即原本是正类&#xff0c;识别的也是正类 TN&#xff1a;正确地预测出了负类&#xff0c;即原本是负类&#xff0c;识别的也是负类 FP&#xff1a;错误地预测为了正类&#xff0c;即原本是负类&#xff0c;识别的是正类…

archLinux安装记录

archLinux安装记录 基于wsl的arch 启用wsl 首先&#xff0c;按Win S搜索启用或关闭Windows功能&#xff08;Turn Windows features on or off&#xff09;,打开虚拟机平台和WSL&#xff0c;并重启Windows。 重启后&#xff0c;进入Windows设置&#xff0c;检查更新。 更新完…

Lua内存管理策略

传统的内存管理策略主要分为两种&#xff1a;引用计数&#xff0c;和垃圾回收。相比后者每一段时间执行一次回收周期&#xff0c;前者是对于每一个变量都维护被引用数的策略。对于Lua这种轻量化语言而言&#xff0c;占据大内存的开销是极力避免的&#xff0c;而前者的方式显然是…

自动化测试-RIDE编写自动化脚本

自动化脚本软件测试的必修内容&#xff0c;是自动化测试的核心&#xff0c;脚本的逻辑严谨性、可维护性非常重要&#xff0c;优秀的自动化脚本需要能兼顾用例的正确有效性和自动化测试的效率&#xff0c;本篇文章将介绍如何用RIDE写自动化脚本。我们将深入探讨RIDE的具体用法&a…

websocket数据帧格式

客户端、服务端数据的交换&#xff0c;离不开数据帧格式的定义。因此&#xff0c;在实际讲解数据交换之前&#xff0c;我们先来看下WebSocket的数据帧格式。 WebSocket客户端、服务端通信的最小单位是帧&#xff08;frame&#xff09;&#xff0c;由1个或多个帧组成一条完整的消…

【Node.js】path 模块进行路径处理

Node.js 执行 JS 代码时&#xff0c;代码中的路径都是以终端所在文件夹出发查找相对路径&#xff0c;而不是以我们认为的从代码本身出发&#xff0c;会遇到问题&#xff0c;所以在 Node.js 要执行的代码中&#xff0c;访问其他文件&#xff0c;建议使用绝对路径 实例&#xff1…