IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity Shader - URP Instancing -> 正文阅读

[游戏开发]Unity Shader - URP Instancing

URP 中的内置 GPU Instancing 的使用,和 Built-in RP 之前的宏定义名字是一样的,而且功能也是一样的,所以:使用方法和 Built-in RP 中没任何却别


Shader

下面代码搜索查看:// jave.lin instancing 相关部分

// jave.lin 2021/10/18
// 测试 URP Instancing 的功能

Shader "Test/URPGPUInstancing"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1, 1, 1, 1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
        Pass
        {
            HLSLPROGRAM
            #define FOG_LINEAR // 我们可以使用明文声明的方式来确定变体
            //#pragma multi_compile_fog // jave.lin fog 变体 keyword 需要,这里注释掉,不用这种方式
            #pragma multi_compile_instancing // jave.lin instancing 定义 INSTANCING_ON 变体开关
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" // jave.lin fog ComputFogFactor, MixFog 等,雾效相关的 API 在里面有
            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" // jave.lin instancing

            CBUFFER_START(UnityPerMaterial) // SRP Batcher 用的 cbuffer,但是 instancing buffer 定义了的话,SRP Batcher 将不会合批来减少 SetPassCall
                float4 _MainTex_ST;
            CBUFFER_END

            UNITY_INSTANCING_BUFFER_START(Props) // jave.lin instancing 不能和 srp batcher 共存,如果要有定义 instancing 的 buffer 内容,shader inspector SRP Batcher 将显示 : not compatible
                UNITY_DEFINE_INSTANCED_PROP(half4, _Color) // jave.lin instancing 定义 PropsArray[N]._Color;
            UNITY_INSTANCING_BUFFER_END(Props) // jave.lin instancing 定义 PropsArray 中的属性

            #pragma vertex vert
            #pragma fragment frag
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID // jave.lin instancing 定义 uint instanceID : SV_InstanceID;
            };
            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                UNITY_VERTEX_INPUT_INSTANCE_ID // jave.lin instancing 定义 uint instanceID : SV_InstanceID;
            };
            TEXTURE2D(_MainTex);
            SAMPLER(sampler_MainTex);
            v2f vert (appdata v)
            {
                v2f o = (v2f)0;
                UNITY_SETUP_INSTANCE_ID(v); // jave.lin instancing 设置 static uint unity_instanceID;
                UNITY_TRANSFER_INSTANCE_ID(v, o); // jave.lin instancing 给 v2f o 设置 uint instanceID : SV_InstanceID;

                o.vertex = TransformObjectToHClip(v.vertex.xyz);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                // jave.lin instancing 根据 instanceID 来取 _MainTex_ST 值,但是 
                //half4 uv_scale_offset = UNITY_ACCESS_INSTANCED_PROP(Props, _MainTex_ST);xxx_ST 是 application 层封装了的黑箱处理,只能设置普通 uniform 值,而不是 cbuffer 中的数值,所以这里如果是从 instancing buffer 中去 _MainTex_ST 将会是去不到的
                //o.uv = uv_scale_offset.xy * o.uv + uv_scale_offset.zw;
                return o;
            }
            half4 frag(v2f i) : SV_Target
            {
                UNITY_SETUP_INSTANCE_ID(i); // 设置 static uint unity_instanceID

                float csz = i.vertex.z * i.vertex.w; // jave.lin fog 因为 vs 阶段后 还有一个 vs post 会处理 vertex data 的 perspective dive 的透视除法,所以这里需要将除去的值重新还原到 clip space z
                real fogFactor = ComputeFogFactor(csz); // jave.lin fog 根据 clip space z 来计算 fog factor
                half4 tintCol = UNITY_ACCESS_INSTANCED_PROP(Props, _Color); // jave.lin instancing 根据 instanceID 来取 _Color 值
                half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv) * tintCol;
                col.rgb = MixFog(col.rgb, fogFactor); // jave.lin fog 根据 fogFactor lerp 混合 src color & fog color
                return col;
            }
            ENDHLSL
        }
    }
}


效果

在这里插入图片描述

但是,如同注释中描述,开启 instancing ,那么 SRP Batcher 将不生效,如下图:
在这里插入图片描述


References

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 12:13:25  更:2021-10-19 12:13:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 0:50:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码