Unity中Batching優化的GPU實例化(4)

文章目錄

  • 前言
  • 一、構建需要實例化的額外數據
  • 二、在頂點著色器,將實例化 ID 從 appdata 存入 v2f 傳給片元著色器
  • 三、在片斷著色器中訪問具體的實例化變量
  • 三、使用代碼修改Shader材質屬性,實現GPU實例化后不同對象顏色不同的效果
    • 1、在C#測試腳本生成小板凳的時候修改材質屬性
    • 2、我們需要使用材質屬性塊來修改才可以不讓GPU實例化失效


前言

在之前的文章中,我們解決了GPU實例化需要的 appdata 、v2f 數據準備 和 使GPU實例化后的頂點位置正確。

  • Unity中Batching優化的GPU實例化(2)

  • Unity中Batching優化的GPU實例化(3)

在這篇文章中,我們來實現一下GPU實例化后怎么使不同對象使用不同的材質顏色,這里只是用顏色作為例子,如果需要 GPU實例化后,不同對象使用不同屬性,也是用此方法。


一、構建需要實例化的額外數據

因為我們需要修改材質的顏色,所以需要定義一個顏色屬性。
但是,在使用GPU實例化定義屬性時,得按如下方法定義

構建需要實例化的額外數據:
#ifdef UNITY_INSTANCING_ENABLED
UNITY_INSTANCING_BUFFER_START(prop自定義名字)
UNITY_DEFINE_INSTANCED_PROP(type, name)
UNITY_INSTANCING_BUFFER_END(prop自定義名字)
#endif

  • 在UnityInstancing.cginc文件中,看一下Unity這句話做了什么

UNITY_INSTANCING_BUFFER_START(prop)

UNITY_INSTANCING_BUFFER_END(prop)

其實這兩句話主要是,定義了一個結構體。

在這里插入圖片描述

  • UNITY_DEFINE_INSTANCED_PROP(fixed4, _Color) 這句話定義結構體中的變量

  • 在我的Shader中,使用材質的顏色屬性作為測試:

UNITY_INSTANCING_BUFFER_START(prop)
UNITY_DEFINE_INSTANCED_PROP(fixed4, _Color)
UNITY_INSTANCING_BUFFER_END(prop)


二、在頂點著色器,將實例化 ID 從 appdata 存入 v2f 傳給片元著色器

UNITY_TRANSFER_INSTANCE_ID(v, o); 當需要將實例化ID傳到片斷著色器時,在頂點著色器中添加.

  • 在UnityInstancing.cginc文件中,看一下Unity這句話做了什么

由源碼可知,這句話做了類似于 o,uv = i.uv; 這樣的操作

在這里插入圖片描述


三、在片斷著色器中訪問具體的實例化變量

UNITY_ACCESS_INSTANCED_PROP(arrayName, propName)

  • 在UnityInstancing.cginc文件中,看一下Unity這句話做了什么

在這里插入圖片描述

  • 我把我測試使用的_Color替換成UNITY_ACCESS_INSTANCED_PROP(prop, _Color)

fixed4 frag (v2f i) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(i);
return i.worldPos.y * 0.15 + UNITY_ACCESS_INSTANCED_PROP(prop, _Color);
}


三、使用代碼修改Shader材質屬性,實現GPU實例化后不同對象顏色不同的效果

做完以上步驟后,我們的Shader就支持GPU實例化后的不同對象使用不同的顏色屬性了。但是,我們要用代碼修改才有用,不是直接調節屬性面板

我們可以看出,調節屬性面板我們的所有 GPU實例化問題,屬性顏色都會隨之改變
請添加圖片描述

1、在C#測試腳本生成小板凳的時候修改材質屬性

  • 我們在生成小板凳時。同時修改小板凳材質屬性的顏色(不能這樣修改,會導致GPU實例化失效):
using UnityEngine;public class P2_6_5 : MonoBehaviour
{public GameObject Prefab;public int Count = 1;public int Range = 10;// Start is called before the first frame updatevoid Start(){for (int i = 0;i < Count;i++){Vector3 pos = Random.insideUnitCircle * Range;Color color = new Color(Random.value,Random.value,Random.value,Random.value);GameObject chair = Instantiate(Prefab,new Vector3(pos.x,0,pos.y),Quaternion.identity);chair.GetComponentInChildren<MeshRenderer>().material.SetColor("_Color", color);}}
}

我們可以看見,雖然顏色變了。但是,GPU實例化失效了

在這里插入圖片描述

2、我們需要使用材質屬性塊來修改才可以不讓GPU實例化失效

MaterialPropertyBlock prop = new MaterialPropertyBlock();
prop.SetColor(“_Color”,color);

using UnityEngine;public class P2_6_5 : MonoBehaviour
{public GameObject Prefab;public int Count = 1;public int Range = 10;// Start is called before the first frame updatevoid Start(){for (int i = 0;i < Count;i++){Vector3 pos = Random.insideUnitCircle * Range;Color color = new Color(Random.value,Random.value,Random.value,Random.value);GameObject chair = Instantiate(Prefab,new Vector3(pos.x,0,pos.y),Quaternion.identity);MaterialPropertyBlock prop = new MaterialPropertyBlock();prop.SetColor("_Color",color);chair.GetComponentInChildren<MeshRenderer>().SetPropertyBlock(prop);}}
}

最終效果(CPU實例化成功,且不同對象有不同的顏色屬性了):

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208146.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208146.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208146.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ReactJs筆記摘錄

前言 以前2018年搞過一段時間react antd開發&#xff0c;兜兜轉轉又回到react世界。 TODO中 Hook函數 JSX語法 根元素與斜杠 注意局部的jsx片段也要加根元素: return (<div>{items.map((item) > (// 此處只能有一個根元素!!!<>...<div className&quo…

要求CHATGPT高質量回答的藝術:提示工程技術的完整指南—第 23 章:命名實體識別提示

要求CHATGPT高質量回答的藝術&#xff1a;提示工程技術的完整指南—第 23 章&#xff1a;命名實體識別提示 命名實體識別&#xff08;NER&#xff09;是一種允許模型對文本中的命名實體&#xff08;如人物、組織、地點和日期&#xff09;進行識別和分類的技術。 要在 ChatGPT…

微前端介紹

目錄 微前端概念 微前端特性 場景演示 微前端方案 iframe 方案 qiankun 方案 micro-app 方案 EMP 方案 無界微前端 方案 無界方案 成本低 速度快 原生隔離 功能強大 總結 前言&#xff1a;微前端已經是一個非常成熟的領域了&#xff0c;但開發者不管采用哪個現…

Leetcode—290.單詞規律【簡單】

2023每日刷題&#xff08;五十一&#xff09; Leetcode—290.單詞規律 實現代碼 class Solution { public:bool wordPattern(string pattern, string s) {unordered_map<char, string> m1;unordered_map<string, char> m2;stringstream stro(s);string tmp;for(a…

(env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序

應公司需求&#xff0c;在特定情況下需要修改ip 在開發過程中出現的小插曲 1、第一種情況&#xff1a;重復聲明 2、第二種情況&#xff1a; 應官方要求&#xff0c;需要跳轉的 tabBar 頁面的路徑&#xff08;需在 pages.json 的 tabBar 字段定義的頁面&#xff09;&#xff0…

React中使用TypeScript代替prop-types

原文鏈接 公眾號-React中使用TypeScript代替prop-types 個人公眾號&#xff0c;嗚嗚嗚&#xff0c;求各位大佬們關注下&#xff0c;本人的公眾號主要寫React 跟NodeJs的 ?關于prop-types 對于部分的同學&#xff0c;不大了解為什么我們的代碼里面要用到prop-types這個庫&a…

ArkTS快速入門

一、概述 ArkTS是鴻蒙生態的應用開發語言。它在保持TypeScript&#xff08;簡稱TS&#xff09;基本語法風格的基礎上&#xff0c;對TS的動態類型特性施加更嚴格的約束&#xff0c;引入靜態類型。同時&#xff0c;提供了聲明式UI、狀態管理等相應的能力&#xff0c;讓開發者可以…

深度學習基礎回顧

深度學習基礎 淺層網絡 VS 深層網絡深度學習常用的激活函數Sigmoid 函數ReLU 函數Softplus 函數tanh函數 歸納偏置CNN適用數據歸納偏置 RNN適用數據歸納偏置 淺層網絡 VS 深層網絡 淺層神經網絡參數過多&#xff0c;導致模型的復雜度和計算量很高&#xff0c;難以訓練。而深層…

Redisson的基礎使用(2)

布隆過濾器&#xff08;Bloom Filter&#xff09; 布隆過濾器一般用于解決緩存穿透的問題。主要原理是使用一組哈希函數&#xff0c;將元素映射成一組位數組中的索引位置。如果要檢查某個元素是否在集合中時&#xff0c;將此元素通過所有的哈希函數&#xff0c;查看哈希值對應的…

硬件開發筆記(十五):RK3568底板電路VGA顯示接口原理圖分析

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134849296 紅胖子網絡科技博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬…

多態和繼承復習

與其明天開始&#xff0c;不如現在行動&#xff01; 文章目錄 多態多態成立的條件細節 繼承&#x1f48e;總結 多態 多態成立的條件 存在繼承關系或者實現關系子類重寫父類的方法父類引用指向子類對象 細節 通過父類的引用調用子類的對象 Animal animal new Dog();animal…

C語言搭建項目-學生管理系統(非鏈表)

、 目錄 搭建offer.h文件 搭建offer.c中的main函數 密碼登入系統 搭建my_oferr.c中的接口函數 使用幫助菜單接口函數 增加學生信息接口函數 查詢學生信息接口函數 刪除學生信息接口函數 保存學生信息接口 打開文件fopen 關閉文件fclose 判斷是否保存文件fwrite 退出執行文件…

C++:const類型數據的修改問題

在C語言中const類型的數據嚴格意義上可以修改&#xff1a; const int a1; int*b&a; *b2;不同于C語言&#xff0c;C中指針類型是要嚴格對應的&#xff0c;對const類型的數據必須使用const類型的指針進行接收&#xff0c;從而避免修改&#xff1b; 但問題是c中同樣支持指針的…

年度工作總結怎么寫?掌握這些年終總結萬能公式,讓你的報告出彩無比!

光陰似箭&#xff0c;日月如梭&#xff0c;時間總是不疾不徐地向前奔去&#xff0c;轉眼就來到了2023年的最后一個月&#xff0c;12月一到&#xff0c;上班族和打工人又要開始忙活工作總結的事情~ 工作總結&#xff0c;不僅是一年工作的回顧&#xff0c;更是未來規劃的起點。你…

Springboot中的RestTemplate

Springboot中的RestTemplate 在Spring Boot應用程序中&#xff0c;RestTemplate是一個用于進行HTTP請求的強大工具。通常用于與RESTful API進行交互、調用其他服務或執行HTTP請求。它提供了各種方法來發送HTTP請求&#xff08;如GET、POST、PUT、DELETE等&#xff09;&#xf…

cuda lib 線程安全的要義

1, 概述 cuda lib 線程安全的幾個多線程的情景&#xff1a; 單卡多線程&#xff1b; 多卡多線程-每卡單線程&#xff1b; 多卡多線程-每卡多線程&#xff1b; 需要考慮的問題&#xff1a; 每個 cublasHandle_t 只能有一個stream么&#xff1f; 每個cusolverHandle_t 只能有一…

python3.5安裝教程及環境配置,python3.7.2安裝與配置

大家好&#xff0c;小編來為大家解答以下問題&#xff0c;python3.5安裝教程及環境配置&#xff0c;python3.7.2安裝與配置&#xff0c;現在讓我們一起來看看吧&#xff01; python 從爬蟲開始&#xff08;一&#xff09; Python 簡介 首先簡介一下Python和爬蟲的關系與概念&am…

Android Studio的代碼筆記--IntentService學習

IntentService學習 IntentService常規用法清單注冊服務服務內容開啟服務 IntentService 一個 HandlerThread工作線程&#xff0c;通過Handler實現把消息加入消息隊列中等待執行&#xff0c;通過傳遞的intent在onHandleIntent中處理任務。&#xff08;多次調用會按順序執行事件…

Spring Cloud Alibaba實踐 --Sentinel

sentinel簡介 Sentinel的官方標題是&#xff1a;分布式系統的流量防衛兵。從名字上來看&#xff0c;很容易就能猜到它是用來作服務穩定性保障的。對于服務穩定性保障組件&#xff0c;如果熟悉Spring Cloud的用戶&#xff0c;第一反應應該就是Hystrix。但是比較可惜的是Netflix…

三防平板|手持終端PDA|8寸/10寸工業三防平板電腦主板方案定制

近年來&#xff0c;隨著科技的快速發展&#xff0c;三防平板成為了各行各業中不可或缺的工具。三防平板采用IP67級別的防護設計&#xff0c;通過了多項測試標準&#xff0c;如國標和美標&#xff0c;具備防水、防摔、防塵、防撞、防震、防跌落以及防鹽霧等多重防護功能。因此&a…