Unity异步把图片数据从显存下载到内存(GPU->CPU)
Unity异步把图片数据从显存下载到内存(GPU->CPU)
1.c#核心代码
using System.Collections;
using System.Collections.Generic;
using Unity.Collections;
using UnityEditor.PackageManager.Requests;
using UnityEngine;
using UnityEngine.Rendering;namespace Tools
{/// <summary>/// RenderTexture转Bytes/// </summary>public class TextureOrBytes{private ComputeShader computeShader;private Texture srcRrenderTexture;private RenderTexture dstRenderTexture;private int kernelHandle;private bool requestPending;private NativeArray<byte> srcNativeArray;private byte[] dstRTData;private int width;private int height;private int memorySize;private int threadGroupsX;private int threadGroupsY;private object lockObject = new object();public TextureOrBytes(ComputeShader _computeShader, Texture _srcRrenderTexture){computeShader = _computeShader;srcRrenderTexture = _srcRrenderTexture; Init();}public void Update(){if (!requestPending){computeShader.Dispatch(kernelHandle, threadGroupsX, threadGroupsY, 1);AsyncGPUReadback.Request(dstRenderTexture, 0, TextureFormat.RGBA32, OnCompleteReadback);requestPending = true;}}public void Clear(){if (dstRenderTexture != null){dstRenderTexture.Release();dstRenderTexture = null;}if (srcNativeArray != null){srcNativeArray.Dispose();}dstRTData = null;lockObject = null;}private void Init(){width = srcRrenderTexture.width;height = srcRrenderTexture.height;memorySize = width * height * 4;srcNativeArray = new NativeArray<byte>(memorySize, Allocator.Temp);dstRTData = new byte[memorySize];//创建临时RTdstRenderTexture = new RenderTexture(width, height, 0, RenderTextureFormat.ARGB32);dstRenderTexture.enableRandomWrite = true;dstRenderTexture.Create();kernelHandle = computeShader.FindKernel("CSMain");computeShader.SetTexture(kernelHandle, "sourceTex", srcRrenderTexture);computeShader.SetTexture(kernelHandle, "destTex", dstRenderTexture);threadGroupsX = Mathf.CeilToInt(width / 8.0f);threadGroupsY = Mathf.CeilToInt(height / 8.0f);}private void OnCompleteReadback(AsyncGPUReadbackRequest request){if (srcNativeArray == null || dstRTData == null || lockObject == null){requestPending = false;return;}if (!request.done){Debug.Log("GPU readback hasnt done yet");return;}if (request.hasError){Debug.LogError("GPU readback error detected.");requestPending = false;return;}srcNativeArray = request.GetData<byte>(); lock (lockObject){if (srcNativeArray.Length == dstRTData.Length){srcNativeArray.CopyTo(dstRTData);}}requestPending = false;}public byte[] GetTexGPUBytesData(){lock (lockObject) {return dstRTData;}}public Texture GetTex(){return srcRrenderTexture;}public RenderTexture GetRWTex(){return dstRenderTexture;}#region 递归方式..private void StartRequestReadbacks(){computeShader.Dispatch(kernelHandle, threadGroupsX, threadGroupsY, 1);AsyncGPUReadback.Request(dstRenderTexture, 0, TextureFormat.RGBA32, OnCompleteReadback_Recursive);}private void OnCompleteReadback_Recursive(AsyncGPUReadbackRequest request){if (srcNativeArray == null || dstRTData == null || lockObject == null){requestPending = false;return;}if (!request.done){Debug.Log("GPU readback hasnt done yet");return;}if (request.hasError){Debug.LogError("GPU readback error detected.");requestPending = false;return;}srcNativeArray = request.GetData<byte>();//lock (lockObject){if (srcNativeArray.Length == dstRTData.Length){srcNativeArray.CopyTo(dstRTData);}}StartRequestReadbacks();}#endregion}}
2.ComputeShader核心代码
// Each #kernel tells which function to compile; you can have many kernels
#pragma kernel CSMain// Texture to read from
Texture2D<float4> sourceTex;
// Texture to write to
RWTexture2D<float4> destTex;[numthreads(8, 8, 1)]
void CSMain(uint3 id : SV_DispatchThreadID)
{float4 color = sourceTex[id.xy];destTex[id.xy] = color;
}
3.使用
- 在外部实例化TextureOrBytes
- 在update中调用 TextureOrBytes.Update();
- 通过TextureOrBytes.GetTexGPUBytesData()获取CPU数据
相关文章:
Unity异步把图片数据从显存下载到内存(GPU->CPU)
Unity异步把图片数据从显存下载到内存(GPU->CPU) 1.c#核心代码 using System.Collections; using System.Collections.Generic; using Unity.Collections; using UnityEditor.PackageManager.Requests; using UnityEngine; using UnityEngine.Rende…...
【MySQL】C/C++连接MySQL客户端,MySQL函数接口认知,图形化界面进行连接
【MySQL】C/C引入MySQL客户端 安装mysqlclient库mysql接口介绍初始化mysql_init链接数据库mysql_real_connect下发mysql命令mysql_query获取出错信息mysql_error获取执行结果mysql_store_result获取结果行数mysql_num_rows获取结果列数mysql_num_fields判断结果列数mysql_field…...
Wireshark分析工具
简单用例 首先打开软件,左上角点文件,选中要分析的文件列表。 导入用tcpdump抓的包后进行分析,这里要输入过滤条件,对网络包进行一定的过滤处理。(这里172网段是阿里云的地址,用自己写的python2脚本对阿里…...
linux网络配置脚本
通过脚本,设置静态ip以及主机名 因为企业9的网络配置文件和企业7的不一样所以,我们以rhel9和rhel7为例 rhel7/centos7/openeuler #!/bin/bash cat > /etc/sysconfig/network-scripts/ifcfg-$1 << EOF DEVICE$1 ONBOOTyes BOOTPROTOnone IPAD…...
IT管理:我与IT的故事4
首先,宣布一个“坏消息”。最近Herry童鞋的办公邮箱似乎有些“抽抽”了,所以邮件出现了延迟、拒收、被拒收、甚至是石沉大海的现象。为了能够更好的和大家进行沟通,大家如果发邮件到我办公邮箱的时候,若不嫌麻烦,可以抄…...
短链接系统设计方案
背景 需要设计一个短链接系统,主要功能主要有如下几点: ToB: 输入一个长链接,转换成短链接。这个短链接有时效性,可以设定指定过期时间。这个系统的每天会生成千万级别的短链接。数据具备可分析功能。 ToC…...
Cisco交换机SSH使用RSA公钥免密登录(IOS与Nexus,服务器以RHEL8为例)
目录 需求实验步骤0. 实验环境1. Linux2. CiscoIOS基础设置保存密钥登陆测试 3. CiscoNexus基础配置保存密钥登陆测试 需求 在实际工作中,常会遇到自动化的需求,那么在自动采集、配置等对网络设备的自动化需求中,不可避免的会遇到需要登录-&…...
QT判断操作系统类型和CPU架构
一、判断操作系统类型 1.在.pro文件中判断 macx { # mac only } unix:!macx{ # linux only } win32 { # windows only }2.在代码中判断 可以包含QGlobal头文件,判断预定义宏 #include <QtGlobal> ... #ifdef Q_OS_MAC // mac #endif#ifdef Q_OS_LINUX // …...
input[type=checkbox]勾选框自定义样式
效果图: <template> <input class"rule-checkbox" type"checkbox" checked v-model"isChecked" /> </template><script setup lang"ts"> import { ref } from vue; const isChecked ref(); </…...
鼠害监测系统:科技守护农业安全
在农业生产中,鼠害一直是威胁作物安全、影响产量的重要因素。然而,随着科技的飞速发展,鼠害监测系统正逐步成为现代农业防治鼠害的重要利器。 鼠害监测系统巧妙融合了现代光电、数控及物联网技术,实现了诱鼠、投喂鼠药、鼠情监测及…...
Ubuntu20.04如何安装配置JDK
资源准备 官方下载地址(根据自己的系统版本选择不同版本进行下载即可):Java Downloads | Oracle 如无特殊需要可直接移步至下方JDK1.8安装包 https://download.csdn.net/download/qq_43439214/89646731 安装步骤 创建Java目录 sudo mkdir …...
Python3网络爬虫开发实战(9)代理的使用 (需补充代理池的构建)
文章目录 一、代理的设置1.1 urllib 的代理设置1.2 requests 的代理设置1.3 httpx 的代理设置1.4 aiohttp 的代理设置1.4 Selenium 的代理设置1.6 Playwright 的代理设置 二、代理池的构建和维护2.1 代理池的模块构成2.2 代理池的实现 网站为了避免爬虫采集数据可能会采取一些反…...
人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连
人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连。无论是亲情、友情还是爱情,这些关系在表面的情感纽带之下,实则都涉及到价值交换的原理。这种价值交换并非仅仅局限于物质层面,而是涵盖了情感、心理等人类所需的一切…...
西安电子科技大学萌新智慧指南(校区篇)
本次是西安电子科技大学南校区【本部南校区】 刚刚进入校园 相信大家对校园环境还很陌生 接下来就用一张地图 带大家迅速了解一下南校区的构造 宿舍 学生宿舍主要分为三部分 竹园公寓 1-4 海棠公寓 5-10 丁香公寓 11-15 研究生们主要居住在 海棠续建5、丁香14、丁香1…...
JavaScript基础(33)_鼠标滚轮滚动事件、键盘事件
鼠标滚轮滚动事件:onwheel 获取鼠标滚轮滚动的方向:wheelDelta 比如:向上滚动:109 (所有正值都是向上) 向下滚动:-109(所有负值都是向下) 注意:当…...
怎样做网站推广
拥有一个精致而富有吸引力的网站是成功商业运营的关键。然而,仅仅拥有一个网站是不够的,您还需要通过有效的推广策略吸引更多的访问者。以下是一些成功的网站推广策略,帮助您提升流量并增加知名度。 1. 优化SEO: 搜索引擎优化&am…...
Unity引擎加密方案解析
据悉,Unity引擎的全球市场占有率已经超过50%,而在全球排名前1000的手游当中,这一数据更是高达73%。不止如此,Unity在中国拥有高达350万的注册用户,《崩坏星穹铁道》、《王者荣耀》等爆款游戏均为Unity引擎开发。 庞大…...
遇到的几个iOS问题
1 unable to boot the simulator 跑模拟器的时候遇到这个报错, 解决方法 处理办法: 删除升级之前的模拟器缓存,重启模拟器。删除路径:~/Library/Developer/CoreSimulator/Cache 注意:后面可能还会复现这个报错&#x…...
掌握ChatGPT写作艺术:从入门到精通的四个层次
这些周末我仔细研究了如何通过优化提示词提升ChatGPT输出内容的质量。 关于如何使用ChatGPT辅助我们的写作,我归纳了以下规律,希望能为你带来启发。 一、写作步骤 撰写一篇文章,思路上必须是从抽象到具体逐步深入。 首先我们需要明确写什么…...
虚幻UE5安装报错误代码:SU-PQR5
找到图标的快捷方式 “Epic Games Launcher”右键属性,在目标最后添加-SkipBuildPatchPrereq,如下图: 最后,见证奇迹成功打开软件,可以继续安装啦。 参考资料: 【图片】求教各位大佬--错误代码SU-PQR5【ep…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
