FPS游戏之漫谈截帧技术

什么是截帧技术 简而言之就是截取当前屏幕的内容,然后一般是以图片的形式存入本地

为什么需要这个技术 因为有需求 比如我们需要把我牛逼的战绩炫耀下,是不是以图文的形式分享到朋友圈是不是最直观???

在Unity引擎中,截帧通常指的是将当前游戏画面保存为图像文件(如PNG或JPG格式)的功能。这通常用于创建游戏截图、生成游戏中的艺术图片或用于视频制作。在游戏开发过程中,截帧也可以用于记录游戏中的bug或问题,并与团队或社区分享。
截帧功能也可以用于创建游戏中的头像、封面或者其他与游戏相关的图像素材。

yes

在Unity引擎中,你可以使用以下代码来截取屏幕帧:

using UnityEngine;
public class ScreenCapture : MonoBehaviour
{// 截帧的按键public KeyCode captureKey = KeyCode.C;void Update(){// 当按下指定按键时,执行截帧操作if (Input.GetKeyDown(captureKey)){// 获取屏幕尺寸int width = Screen.width;int height = Screen.height;// 创建一个新的纹理,并将屏幕内容拷贝到这个纹理中Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);tex.Apply();// 将纹理转换为字节数组byte[] bytes = tex.EncodeToPNG();// 保存截帧到文件string timestamp = System.DateTime.Now.ToString("yyyyMMddHHmmss");string filename = "Screenshot_" + timestamp + ".png";System.IO.File.WriteAllBytes(filename, bytes);Debug.Log("Screenshot saved as " + filename);// 释放纹理资源Destroy(tex);}}
}RenderTexture来实现截帧功能的流程是什么呢    请看下面
在Unity引擎中,使用RenderTexture来实现截帧功能通常需要以下步骤:
1. 创建一个RenderTexture对象,该对象将用于存储截帧的图像数据。
```csharp
RenderTexture renderTexture = new RenderTexture(width, height, depth);
  1. 将摄像机的渲染目标设置为该RenderTexture,以便将摄像机渲染的场景渲染到RenderTexture上。
camera.targetTexture = renderTexture;
  1. 执行摄像机的渲染操作,渲染目标将会是RenderTexture。
camera.Render();
  1. 恢复摄像机的渲染目标为默认帧缓冲区。
camera.targetTexture = null;
  1. 将RenderTexture的内容读取为一个2D纹理或者保存为图像文件。
Texture2D texture = new Texture2D(width, height);
RenderTexture.active = renderTexture;
texture.ReadPixels(new Rect(0, 0, width, height), 0, 0);
texture.Apply();
RenderTexture.active = null;

这些步骤可以用于在Unity中实现截帧功能,截取游戏中的特定画面,并将其保存为图像。

那么RenderTexture.ReadPixels到底是如何读取屏幕数据的呢
RenderTexture.ReadPixels 是 Unity 引擎中的一个功能,用于从渲染纹理(RenderTexture)中读取像素数据。这个方法的主要细节如下:

  1. 参数:
    • rect : 一个 Rectangle 对象,定义了要读取的像素区域的左上角坐标和大小。
    • pixels : 一个预先分配好的 Color32[] 或 byte[] 数组,用于存储读取的像素数据。数组的长度应等于 rect.width * rect.height 。
    • alpha : 如果 true ,则读取并包含 alpha 通道的数据;否则只读取 RGB 数据。
    • colorFormat : 可选的 ColorFormat 枚举值,定义了像素数据的格式。默认为 ColorFormat.Default ,即未指定。
  2. 执行过程:
    • ReadPixels 方法会从渲染纹理中复制指定区域的像素数据到提供的 pixels 数组中。如果 alpha 参数为 true ,则会包括 alpha 值;否则,只有 RGB 值会被复制。
    • 这个操作是异步的,意味着它不会立即返回,而是会在后台完成。如果你需要立即获取结果,可以使用 RenderTexture.GetRawTextureData() 方法同步获取。
  3. 注意事项:
    • 由于 RenderTexture 可能被其他线程或组件使用,所以在读取之前最好确保没有其他线程正在写入该纹理。
    • 读取大尺寸的渲染纹理可能会消耗大量内存,因此应谨慎使用。
    • 如果你想要在读取后立即使用这些像素数据,可能需要将它们转换为所需的格式,例如 Texture2D 或 Image 类型。
  4. 示例代码:
    RenderTexture renderTexture = …; // 获取你的渲染纹理
    Rectangle rect = new Rectangle(0, 0, renderTexture.width, renderTexture.height);
    Color32[] pixels = new Color32[rect.width * rect.height];

renderTexture.ReadPixels(rect, pixels, 0, false); // 不包含 alpha
// 或者
renderTexture.ReadPixels(rect, pixels, 0, true); // 包含 alpha

// 现在你可以处理 pixels 数组中的数据
总的来说, RenderTexture.ReadPixels 是一个非常实用的方法,用于在渲染纹理与游戏对象之间交换数据,例如屏幕截图、实时处理等场景。

但是啊 我们这个截帧技术也会出现黑屏的情况呢

在Unity引擎中,使用RenderTexture进行截帧时可能会遇到黑屏的情况,这通常出现在以下情况下:
在 Unity 中,使用 RenderTexture 截帧(通常用于实现屏幕截图或者录制视频)时,可能会遇到黑屏的情况,这主要有以下几个原因:

  1. 渲染目标设置错误:
    • 如果你在代码中没有正确设置 RenderTexture 为相机的渲染目标,那么相机捕获的画面可能不会被 RenderTexture 存储。确保在开始截帧前,将相机的 TargetTexture 属性设置为你要截图的 RenderTexture。
  2. 相机视口问题:
    • 如果相机的 CullingMask 或 Camera Clear Flags 设置不正确,可能会导致某些区域不被渲染。确保相机能看到你想要截图的区域,并且没有被裁剪。
  3. RenderTexture 渲染模式:
    • RenderTexture 的 RenderMode 设置为 RenderMode.ScreenSpaceOverlay 或 RenderMode.PostProcessing 时,可能会影响到截图效果。确保在截帧前将其设置为 RenderMode.ColorBufferOnly 。
  4. 光照和阴影问题:
    • 如果场景中的光照设置不合理,或者存在阴影遮挡,可能导致部分区域看起来是黑色。检查光源和阴影设置,确保它们不会影响截图区域。
  5. 透明度和 Alpha 通道:
    • 如果截图中包含透明物体,而 ReadPixels 操作不包含 alpha 通道,那么透明区域可能会显示为黑色。确保 ReadPixels 的 alpha 参数设置为 true 。
  6. 内存限制:
    • 大尺寸的 RenderTexture 或连续多次截帧可能会导致内存不足,尤其是在低内存设备上。确保有足够的内存空间,并在必要时释放不再使用的 RenderTexture。
  7. 异步读取问题:
    • 如果 ReadPixels 是异步执行的,但没有正确处理回调,可能会导致截图过程卡顿或黑屏。确保正确处理异步操作的结果。
  8. 错误的代码逻辑:
    • 在处理 RenderTexture 的过程中,可能存在代码逻辑错误,比如在读取前没有正确初始化像素数组,或者在读取后没有正确处理数据。
      解决这些问题后,通常可以避免 RenderTexture 截帧时出现黑屏的情况。
  9. 摄像机未正确设置:如果摄像机在渲染之前或者渲染过程中未正确设置渲染目标为RenderTexture,可能会导致截取的RenderTexture出现黑屏。
  10. 渲染顺序问题:如果在截帧的过程中,RenderTexture的渲染顺序与实际场景中的渲染顺序不一致,可能导致黑屏。这通常发生在多摄像机场景中,需要确保摄像机的渲染顺序正确设置。
  11. 未正确渲染:在进行截帧时,如果摄像机未执行渲染操作,或者渲染的内容为空,可能导致RenderTexture中的内容为空,呈现为黑屏。
  12. 分辨率设置问题:有时候RenderTexture的分辨率设置不正确也会导致黑屏情况。
    解决这些问题的方法包括确保摄像机的渲染目标正确设置为RenderTexture,按正确的渲染顺序进行设置,确保摄像机执行了渲染操作,以及正确设置RenderTexture的分辨率。

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

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

相关文章

Aigtek高压放大器是什么东西做的

在许多电子应用中,需要将低电压信号放大到较高电压以满足特定的需求。为了实现这个目标,高压放大器被广泛采用。高压放大器是一种专用电子设备,使用特定的电路和器件来增益输入信号的电压。它通常由以下几个主要组成部分构成。 电源供应 高压…

Linux编译器---gcc/g++使用详解

目录 前言 gcc/g介绍 gcc/g的编译指令(以gcc为例) ​编辑 gcc选项 预处理(进行宏替换) 编译(生成汇编) 汇编(生成机器可识别代码) 链接(生成可执行文件或库文件) 函数库 概念 …

网络金融治理模式下第三方支付风险与应对路径

随着经济社会的高速发展,消费模式日益多样化,其中,第三方支付作为一种便捷的消费支付模式,在顺应时代发展潮流中应运而生。这种支付模式通过中国人民银行批准,持有《支付业务许可证》,并与银行签约&#xf…

训练yolov8+SAM的过程记录

1-首先将拿到的数据集进行重新命名(dataset1:是经过校色之后裁剪的图片;dataset2:原图) 图片文件从1.jpg开始命名的代码: folder_path = rC:\Users\23608\Desktop\Luli_work\data\fanStudent\tongueseg\Fan\Fan\.jpg new_folder = rC:\Users\23608\Desktop\Luli_work\da…

stable diffusion官方版本复现

踩了一些坑,来记录下 环境 CentOS Linux release 7.5.1804 (Core) 服务器RTX 3090 复现流程 按照Stable Diffusion的readme下载模型权重、我下载的是stable-diffusion-v1-4 版本的 1 因为服务器没法上huggingface,所以得把权重下载到本地&#xff…

初识表及什么是数据表

一、了解表 1.1.概述 表是处理数据和建立关系型数据库及应用程序的基本单元,是构成数据库的基本元素之一,是数据库中数据组织并储存的单元,所有的数据都能以表格的形式组织,目的是可读性强。 1.2.表结构简述 一个表中包括行和列…

当项目经理的一定要考PMP嘛?

PMP资格认证并不是强制性要求,但强烈建议考虑获取该资格!首先让我们来了解一下PMP是什么,然后再谈谈为什么建议考取PMP资格的理由。 PMP(Project Management Professional)是项目管理专业人员的资格认证。该认证由全球…

SCI一区 | Matlab实现GAF-PCNN-MSA格拉姆角场和双通道PCNN融合注意力机制的多特征分类预测

SCI一区 | Matlab实现GAF-PCNN-MSA格拉姆角场和双通道PCNN融合注意力机制的多特征分类预测 目录 SCI一区 | Matlab实现GAF-PCNN-MSA格拉姆角场和双通道PCNN融合注意力机制的多特征分类预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实…

老子云3D资源服务与应用平台详解

老子云平台定位 老子云目标客群 老子云平台架构 老子云平台价值 核心优势 -AMRT标准格式 -自动模型轻量化 -持续精进的底层技术算法 -千万级轻量化3D资源素材市场 功能服务 -格式转换 -蒙皮动画轻量化 -倾斜摄影轻量化 -效果编辑器 -应用编辑器 -3D OFD应用 -A3D PPT -3D资源…

力扣日记2.22-【回溯算法篇】47. 全排列 II

力扣日记:【回溯算法篇】47. 全排列 II 日期:2023.2.22 参考:代码随想录、力扣 47. 全排列 II 题目描述 难度:中等 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输…

SpringBoot中定义了Bean,但是为什么依赖注入的时候注入不了

背景&#xff1a; 扩展RedisTemplate的实现的时候写了这样一段代码&#xff1a; public class BusinessRedisTemplate extends RedisTemplate<String, String> {private final String prefix "business";public BusinessRedisTemplate (RedisConnectionFact…

十八、图像像素类型转换和归一化操作

项目功能实现&#xff1a;对一张图像进行类型转换和归一化操作 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 norm.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class NORM { public:void norm(Mat& image); };#pragma once二…

智慧公厕是什么?智慧公厕是构建智慧城市的环境卫生基石

随着城市化进程的不断加速&#xff0c;城市人口密度和流动性也逐渐增大&#xff0c;对城市公共设施的需求与日俱增。而在这些公共设施中&#xff0c;公厕作为城市基础设施中不可或缺的一环&#xff0c;对城市的环境卫生和市民生活质量起着举足轻重的作用。如何提高公厕的管理效…

android studio 中使用kotlin语言 直接操作布局id

android studio 中使用kotlin语言 直接操作布局id 需要在 build.gradle 文件 引入 apply plugin: kotlin-android apply plugin: kotlin-android-extensions&#xff08;会自动生成&#xff0c;可忽略&#xff09;然后在 Activity 文件中 引入 对应的 layout 文件 如&#xff…

MacOs 围炉夜话

文章目录 一、安装 Mac 一、安装 Mac macOS是一套由苹果开发的运行于Macintosh系列电脑上的操作系统。macOS是首个在商用领域成功的图形用户界面操作系统。 VM虚拟机怎么安装mac os&#xff1f;&#xff08;全教程&#xff09; 虚拟机&#xff1a;VMware Workstation 17 pro W…

新书推荐:《分布式商业生态战略:未来数字商业新逻辑与企业数字化转型新策略》

近两年&#xff0c;商业经济环境的不确定性越来越明显&#xff0c;市场经济受到疫情、技术、政策等多方因素影响越来越难以预测&#xff0c;黑天鹅事件时有发生。在国内外经济方面&#xff0c;国际的地缘政治对商业经济产生着重大的影响&#xff0c;例如供应链中断&#xff0c;…

Shopify配置项过多如何在代码层面简化输出内容

在处理 Shopify 的配置项过多的情况下&#xff0c;可以通过在代码层面简化输出内容来提高效率和可维护性。以下是一些方法&#xff1a; 1. 使用循环和条件语句 使用循环和条件语句来动态生成和输出内容。通过遍历配置项的列表或对象&#xff0c;可以根据条件决定是否输出相应的…

Backend - Django SimpleUI(美化 Django Admin )

目录 一、作用 二、安装 & 配置 &#xff08;一&#xff09;安装依赖 &#xff08;二&#xff09;配置 &#xff08;三&#xff09;运行 三、基础设定 &#xff08;一&#xff09;创建用户 &#xff08;二&#xff09;设置标题 &#xff08;三&#xff09;设置登录…

代理模式笔记

代理模式 代理模式代理模式的应用场景先理解什么是代理&#xff0c;再理解动静态举例举例所用代码 动静态的区别静态代理动态代理 动态代理的优点代理模式与装饰者模式的区别 代理模式 代理模式在设计模式中是7种结构型模式中的一种&#xff0c;而代理模式有分动态代理&#x…

rabbitmq知识梳理

一.WorkQueues模型 Work queues&#xff0c;任务模型。简单来说就是让多个消费者绑定到一个队列&#xff0c;共同消费队列中的消息。 当消息处理比较耗时的时候&#xff0c;可能生产消息的速度会远远大于消息的消费速度。长此以往&#xff0c;消息就会堆积越来越多&#xff0c…