当前位置: 首页 > news >正文

【Unity Shader】Shader基础

目录

  • Chapter3 Unity Shader 基础

Chapter3 Unity Shader 基础

概述

在Unity需要材质(Material)与Unity Shader配合使用来达到满意的效果。

  1. Unity Shader定义了渲染需要的各种代码(顶点着色器与片元着色器等),属性(使用哪些纹理)和指令(渲染和标签设置),我们通过材质调节这些属性,再赋给相应的模型。
  2. 材质:配合GameObject的Mesh或者Particle Systems组件来工作。
  3. Unity Shader:
    1. Standard Surface Shader:使用了一个包含了标准光照模型的表面着色器模板
    2. Unlit Shader: 一个不包含光照但是包含雾效的基本顶点/片元着色器
    3. Image Effect Shader: 为实现屏幕后处理提供基本模板
    4. Compute Shader: 借助GPU的并行性来进行一些与渲染流水线无关的计算

ShaderLab

一款专门为Unity Shader服务的语言。

Properties 属性
  1. 语句格式:Name("display name",PropertyType)=DefaultValue
  2. 支持的属性类型:
    | 属性类型 | 定义语法 ||
    |:--------:|:--------:||
    |Int|number||
    |Float|number|
    |Range(min,max)|number|
    |Color|(number,number,number,number)|
    |Vector|(number,number,number,number)|
    |2D|"defaulttexture"{}|
    |Cube|"defaulttexture"{}|
    |3D|"defaulttexture"{}|

Unity允许重载默认的材质编辑面板以提供更多的自定义数据类型。 关键词“Custom Shader GUI”
Properties语义块的作用仅仅是为了让这些属性可以出现在材质面板里

SubShader:表面着色器
  1. 语句格式
SubShader{
    //可选的,标签
    [Tags]

    //可选的,状态
    [RenderSetup]

    //一次完整的渲染流程,如果pass的数目过多,会造成渲染性能的下降。
    Pass{
    }
    ...
}
  1. RenderSetup 状态:关于渲染状态的设置指令
    | 状态名称 | 设置指令 |解释|
    |:--------:|:--------:|:----:|
    | Cull |Cull Back/Front/Off| 剔除模式:剔除背面/正面/关闭剔除|
    |ZTest|ZTest Less Greater/LEqual/GEqual/Equal/NotEqual/Always|设置深度剔除时使用的函数|
    |ZWrite|ZWrite On/Off|关闭/开启深度写入|
    |Blend|Blend SrcFactor DstFactor|开启并设置混合模式|

  2. Tags 标签:希望怎样以及何时渲染这个对象Tags{"TagName1"="Value1" "TagName2"="Value2"}
    | 标签类型 | 说明 |
    |--------|--------|
    | Queue | 控制渲染顺序,指定该物体属于哪一个渲染队列 |
    |RenderType|对着色器进行分类,可以用于着色器替换功能|
    |DisableBatching|指明是否对该SubShader使用批处理|
    |ForceNoShadowCasting|控制使用该SubShader的物体是否会投射阴影|
    |IgnoreProjector|控制使用该SubShader的物体是否受projector(投影仪?)的影响|
    |CanUseSpriteAtlas|当该SubShader是用于sprite时,将该标签设为“false”|
    |PreviewType|指明材质面板将如何预览该材质。默认材质下,材质将显示为一个球形,我们可以通过将该标签的值设为“Plane”“SkyBox”来改变预览类型|
    上述标签可以在SubShader中声明,而不可以在Pass块中声明,Pass块有专属于自己的标签。

  3. Pass语义块:

    Pass{
        [Name]
        [Tag]
        [RenderSetup]
        // Other code
    }
    1. Name “MyPassName”:定义该Pass的名称,可以使用UsePass命令来直接使用其他unity shader中的Pass,例如:UsePass "MyShader/MYPASSNAME",由于Unity 内部会将所有Pass 名称转换为大写字母的表示,所以在使用UsePass的时候必须使用大写形式的名字。
    2. RenderSetup:我们可以对Pass设置渲染状态,除上述状态设置以外,我们还可以使用固定管线的着色器。
    3. Tag:
      |标签类型|说明|例子|
      |---|----|---|
      |LightMode|定义该Pass在Unity渲染流水线中的角色|Tags{"LightMode"="ForwardBase"}|
      |RequireOptions|用于制定当满足某些条件的时候才渲染该Pass,它的值是一个由空格分割的字符串,目前支持的选项:SoftVegetation|Tags{"RequireOptions"="SoftVegetation"}|

    4. 特殊的Pass:

      • UsePass:使用该指令复用其他UnityShader中的Pass。

      • GrabPass:负责抓取屏幕并将结果存储在一张纹理之中,以用于后续的Pass 处理。

FallBack

如果上面所有的SubShader在这块显卡上都不能运行,那么就用这个最低级的Shader。

FallBack "name"
// 或者
FallBack Off

通过一个字符串通知引擎最低级的Shader是哪个,也可以关闭Fallback功能——如果上述的SubShader无法使用,那就不要管它了。

其他语义
  • 拓展编辑界面:CustomEditor
  • 对命令进行分组:CateGory

UnityShader的形式

ShaderLab语句块:

Shader "Myshader"{
    Properties{
        // 所需的各种属性
    }
    SubShader{
        // 真正意义上的SubShdaer代码会出现在这里
        // 表面着色器(Surface Shader)
        // 顶点/片元着色器(Vertex/Fragment Shader)
        // 固定函数着色器(Fixed Function Shader)
    }
    SubShader{
        // 与上一个Shader类似
    }
}
表面着色器

当给Unity提供一个表面着色器的时候,它在背后依旧将其转换为对应的顶点/片元着色器。意义在于Unity为我们处理了很多光照细节,使得我们无需再操心这些事情。

Shader "Custom/Simple Surface Shader"{
    SubShader{
        Tags{ "RenderType" = "Opaque" }
        CGPROGRAM
        #pragma surface surf Lambert
        struct Input {
            float4 color:COLOR;
        };
        void surf (Input IN,inout SurfaceOutput o)
        {
            o.Albedo = 1;
        }
        ENDCG
    }
    Fallback "Diffuse"
}

表面着色器被定义在SubShader语义块中的CGPROGRAM与ENDCG之间。之间的代码使用Cg/HLSL语言编写,它嵌套在ShaderLab语言中。

顶点/片元着色器

顶点/片元着色器的代码需要定义在CGPROGRAM与ENDCG之间,而着色器是写在Pass语义块内,而非SubShader内,这样做来定义每个Pass需要的Shader代码,灵活性更高,同时控制渲染的实现细节。

Shader "Custom/Simple VertexFragment Shader"{
    SubShader{
        Pass{
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            float4 vert(float4 v:POSITION):SV_POSITION{
                return mul(UNITY_MATRIX_MVP,v);
            }

            fixed4 frag():SV_Target{
                return fixed4(1.0,0.0,0.0,1.0);
            }

            ENDCG
        }
    }
}
固定函数着色器

上面两种UnityShader形式都使用了可编程管线,而对于一些旧的设备不支持可编程管线着色器,此时需要使用固定函数着色器来完成渲染,这些着色器往往只可以完成一些非常简单的效果。

Shader "Tutorial/Basic"{
    Properties{
        _Color("Main Color",color)=(1.0,5.0,5.1)
    }
    SubShader{
        Pass{
            Material{
                Diffuse[_Color]
            }
            Lighting On
        }
    }
}
乐乐女神的一些建议:
  • 除非有明确的需求必须要使用固定函数着色器,否则请使用可编程管线的着色器。
  • 如果想和各种光源打交道,你可能更喜欢表面着色器,但需要小心它在移动平台的性能表现。
  • 如果需要使用的光照数目非常少,使用顶点/片元着色器是一个更好的选择。
  • 如果有很多自定义的渲染效果,请选择顶点/片元着色器。

转载于:https://www.cnblogs.com/zhang-mo/p/9834090.html

相关文章:

  • vue项目使用微信公众号支付
  • 你连这10个工具都不知道,还是程序员?
  • DDL语言
  • BZOJ 1568: [JSOI2008]Blue Mary开公司
  • Ubuntu 16.04 下 安装go
  • PHP CLI应用的调试原理
  • springboot入门_email
  • Python MetaClass深入分析
  • Python中常见的字符串的操作方法:
  • 记录LNMP多主机架构Wordpress博客实施过程中的一些坑
  • 表单提交时问题总结
  • iOS:The operation couldn’t be completed. (DVTCoreSimulatorAdditionsErrorDomain error 0.)
  • python关于标识符说明
  • 类的自动加载
  • 【DP复习】背包 ovo
  • [case10]使用RSQL实现端到端的动态查询
  • [Vue CLI 3] 配置解析之 css.extract
  • 《剑指offer》分解让复杂问题更简单
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【剑指offer】让抽象问题具体化
  • Angular 响应式表单之下拉框
  • ES6之路之模块详解
  • ESLint简单操作
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • PHP变量
  • PHP面试之三:MySQL数据库
  • Python实现BT种子转化为磁力链接【实战】
  • Redux 中间件分析
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • VUE es6技巧写法(持续更新中~~~)
  • 产品三维模型在线预览
  • 猴子数据域名防封接口降低小说被封的风险
  • 让你的分享飞起来——极光推出社会化分享组件
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • (11)MSP430F5529 定时器B
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (9)STL算法之逆转旋转
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)php新闻发布平台 毕业设计 141646
  • (南京观海微电子)——I3C协议介绍
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)可以带来幸福的一本书
  • ./configure、make、make install 命令
  • .htaccess配置常用技巧
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET上SQLite的连接
  • .NET中winform传递参数至Url并获得返回值或文件
  • /etc/sudoer文件配置简析