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.pswp.cn/news/697310.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697310.shtml
英文地址,請注明出處:http://en.pswp.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…