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 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 把3D场景中的所有帧变成图片保存起来 -> 正文阅读

[游戏开发]把3D场景中的所有帧变成图片保存起来

应用场景

Attach EncAll.cs to a Unity Project to generate all frames in the scene with specific granulity. The output format is .png.


using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Rendering;

public class EncAll : MonoBehaviour
{
    //FileInfo theSourceFile = null;
    StreamReader reader = null;
   // string text = " ";
    public string histFilename = "./histTrace.txt";
    public bool encFlag = false;
    public string frameDirName = "./frame/"; //需要自己创建文件夹

    RenderTexture equirect;
    RenderTexture cubemap;
    FileStream fs;
    int sqr = 1024;  
    public int width = 1920;
    public int height = 1080;

    public new Camera camera; //camera 实体要绑定
    string pose;
    Vector3 init_pos;
    Vector3 prac_pos;
    public float granular = 0.05f; 

    int enc_width;
    int enc_height;

   // long last_frame_time = 0;
    int cnt = 0;

    // Start is called before the first frame update
    void Start()
    {
        //text = reader.ReadLine();
        if (encFlag)
        {
            cubemap = new RenderTexture(sqr, sqr, 24, RenderTextureFormat.BGRA32);
            cubemap.dimension = TextureDimension.Cube; //注意,必须将 RenderTexture 的 RenderTexture.dimension 设置为 TextureDimension.Cube。

            equirect = new RenderTexture(width, height, 24, RenderTextureFormat.BGRA32);
            enc_width = width;
            enc_height = height;
        }
        init_pos = transform.position;
        prac_pos = transform.position;

        //File.ReadLines(histFilename).Last();
        //Debug.Log(histFilename);
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 pos = transform.position;
        if ((pos.z - init_pos.z) >= 30) return;
        
        prac_pos.x = pos.x - init_pos.x;
        prac_pos.z = pos.z - init_pos.z;
        Decimal posX = Math.Round((Decimal)(prac_pos.x * 100.0));
        Decimal posZ = Math.Round((Decimal)((prac_pos.z) * 100.0));
        pose = "(" + (int)(posX) + "," + (int)(posZ) + ")";
        cnt++;
        Debug.Log(cnt + " " + pos + " " + pose );

        StreamWriter file = new StreamWriter(histFilename, true);
        file.WriteLine(cnt + " " + pos + " " + pose);
        file.Close();

        //transform.eulerAngles = ori;
        //text = reader.ReadLine();
    }

    void LateUpdate()
    {
        Vector3 pos = transform.position;
        if ((pos.z - init_pos.z) >= 30) return;

        geneFrame();

        if ((pos.x + granular - init_pos.x) < 26)
        {
            pos.x += granular;
        }
        else
        {
            pos.z += granular;
            pos.x = init_pos.x;
        }

        transform.position = pos;
    }

    void geneFrame()
    {
        string pos_file_name = frameDirName + pose + ".png";
        // encode to png 
        camera.RenderToCubemap(cubemap, 63, Camera.MonoOrStereoscopicEye.Mono);
        cubemap.ConvertToEquirect(equirect, Camera.MonoOrStereoscopicEye.Mono);

        Texture2D ori_tex = new Texture2D(width , height, TextureFormat.BGRA32, false);
        ori_tex.ReadPixels(new Rect(0 , 0, ori_tex.width, ori_tex.height), 0, 0, false);
        ori_tex.Apply();
        byte[] tex_bytes = ori_tex.EncodeToPNG();
        System.IO.File.WriteAllBytes(frameDirName + pose + ".png", tex_bytes);
        Destroy(ori_tex);
        tex_bytes = null;
    }

    private void OnDestroy()
    {
        if (reader != null)
            reader.Close();
    }
}

1. RenderTexture.RenderTextureConstructor

cubemap = new RenderTexture(sqr, sqr, 24, RenderTextureFormat.BGRA32);

2. 渲染到一个立方体贴图

camera.RenderToCubemap(cubemap, 63, Camera.MonoOrStereoscopicEye.Mono);
public bool RenderToCubemap (RenderTexture cubemap, int faceMask, Camera.MonoOrStereoscopicEye stereoEye);

  • 参数
    cubemap 要渲染到的纹理。
    faceMask 位域,指示应渲染到立方体贴图的哪些面。设置为整数值 63 将渲染所有面。
    stereoEye 摄像机眼,对应于左眼或右眼(用于立体渲染),或不对应于眼睛(用于非立体渲染)。

  • 返回
    bool 如果渲染失败,返回 false,否则返回 true。

  • 描述
    从该摄像机将一个 360 度立体图像的一侧渲染到一个立方体贴图。

将 stereoEye 参数设置为 Camera.MonoOrStereoscopicEye.Left 或 Camera.MonoOrStereoscopicEye.Right 后将以适当的世界空间变换来渲染 360 度立体图像的左眼或右眼视角。
将 stereoEye 设置为 Camera.MonoOrStereoscopicEye.Mono 可渲染场景的单视场视图。渲
染单独的左右立方体贴图之后,可以将其转换成占用一个纹理的等距圆柱投影全景图像。

3. 将渲染纹理转换为等距圆柱投影格式

RenderTexture.ConvertToEquirect

 cubemap.ConvertToEquirect(equirect,Camera.MonoOrStereoscopicEye.Mono);
public void ConvertToEquirect (RenderTexture equirect, Camera.MonoOrStereoscopicEye eye);
  • 参数
    equirect 要将等距圆柱投影格式渲染到的 RenderTexture。
    eye 摄像机眼,对应于左眼或右眼(用于立体渲染),或不对应于眼睛(用于单视场渲染)。
  • 描述
    将渲染纹理转换为等距圆柱投影格式(都为立体或单视场等距圆柱投影)。 左眼占据上半部分,右眼占据底部。单视场版本将占据整个纹理。 纹理尺寸必须为 TextureDimension.Cube 类型。

4.Unity 保存 RenderTexture 为 .Png

 Texture2D ori_tex = new Texture2D(width , height, TextureFormat.BGRA32, false);
 ori_tex.ReadPixels(new Rect(0 , 0, ori_tex.width, ori_tex.height), 0, 0, false);
 ori_tex.Apply();
 byte[] tex_bytes = ori_tex.EncodeToPNG();
 System.IO.File.WriteAllBytes(frameDirName + pose + ".png", tex_bytes);
 Destroy(ori_tex);
 tex_bytes = null;
  游戏开发 最新文章
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
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 01:19:47  更:2022-09-30 01:20:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/17 3:45:51-

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