【Unity3D】立方体纹理(Cubemap)和天空盒子(Skybox)

news2025/1/15 19:50:45

 1 立方体纹理(Cubemap)

        本文完整资源见 → 立方体纹理(Cubemap)和天空盒子(Skybox) 。

        1)立方体纹理简介

        立方体纹理是指由上、下、左、右、前、后 6 张纹理组成的立方体结构纹理,其主要用于天空盒子、环境映射、反射、折射等场景。

        在 Assets 窗口右键,依次选择【Create → Legacy → Cubemap】,即可创建 Cubemap,如下:

  • Face size:每个面的像素宽度或高度;
  • Linear:是否使用线性颜色;
  • Readable:每个面的像素是否允许脚本读取。

        2)生成立方体纹理

        如果已经有了 6 个面的纹理,直接将这些面拖拽到 Cubemap 中对应的 face 里;如果没有 6 个面的纹理,可以使用以下脚本生成场景中的 Cubemap 及 6 个面的纹理。

        RenderCubemapWizard.cs

using UnityEngine;
using UnityEditor;
using System.IO;

public class RenderCubemapWizard : ScriptableWizard
{
	public Transform viewPosition; // 观察位置(临时相机需要放置的位置)
	public Cubemap cubemap; // 生成的Cubemap

	[MenuItem("GameObject/Render Cubemap")]
	static void RenderCubemap()
	{ // 选择菜单时回调
		ScriptableWizard.DisplayWizard<RenderCubemapWizard>("Render cubemap", "Render");
	}

	void OnWizardUpdate()
	{ // 开启窗口或数据更新时回调
		helpString = "在观察位置处生成Cubemap和6面纹理";
		isValid = (viewPosition != null) && (cubemap != null);
	}

	void OnWizardCreate()
	{ // 点击"Render"按钮时回调
		GameObject go = new GameObject("CubemapCamera");
		go.transform.position = viewPosition.position;
		Camera camera = go.AddComponent<Camera>();
		camera.RenderToCubemap(cubemap); // 生成cubemap
		DestroyImmediate(go);
		SaveCubemap2Png();
	}

	private void SaveCubemap2Png()
	{ // 导出cubemap的6张纹理为png
		Texture2D texture2D = new Texture2D(cubemap.width, cubemap.height, TextureFormat.RGB24, false);
		Color[] flipColors = new Color[cubemap.width * cubemap.height];
		for (int i = 0; i < 6; i++)
		{
			CubemapFace face = (CubemapFace)i;
			Color[] colors = cubemap.GetPixels(face);
			FlipColors(colors, flipColors, cubemap.width, cubemap.height);
			texture2D.SetPixels(flipColors);
			string path = Application.dataPath + "/Resources/Materials/" + cubemap.name + "_" + face.ToString() + ".png";
			File.WriteAllBytes(path, texture2D.EncodeToPNG());
		}
		DestroyImmediate(texture2D);
	}

	private void FlipColors(Color[] colors, Color[] flipColors, int width, int height)
	{ // 上下、左右翻转(或180°旋转)像素
		for (int i = 0; i < colors.Length; i++)
        {
			int x = width - 1 - i % width;
			int y = height - 1 - i / width;
			flipColors[i] = colors[y * width + x];
		}
	}
}

        说明:RenderCubemapWizard 脚本组件需要放在【Assets/Editor】目录下。

        编译成功后,在菜单栏依次选择【GameObject → Render Cubemap】,打开如下窗口:

         说明:在 Hierarchy 窗口创建空对象,调整其位置,拖拽到 Render cubemap 窗口的 ViewPosition 中;在 Assets 窗口创建 Cubemap,设置好参数,拖拽到 Render cubemap 窗口的 Cubemap 中。点击 Render 按钮,就会自动填充 Cubemap 的 6 面纹理,并生成 6 张 png 格式图片。

        如果用户想使用这 6 张纹理重新绑定 Cubemap 或 Skybox 材质中,需要设置 Texture 的 Wrap Mode 为 Clamp(避免边缘异常),如下:

2 天空盒子(Skybox)

        1)设置 Clear Flags

        天空盒子用于渲染场景背景,需要将相机的 Clear Flags 属性设置为 Skybox 才能使用天空盒子。

        2)创建 Skybox 材质

        在 Assets 窗口创建材质,修改其 Shader 属性为【Skybox/Cubemap】,将第 1 节创建的 Cubemap 拖拽到 Cubemap (HDR) 中,如下:

         用户也可以修改材质的 Shader 属性为【Skybox/6 Sided】,将第 1 节创建的 6 面纹理拖拽到对应面中,如下:

         注意:Front [+Z] 对应 xxx_NegativeZ,Back [-Z] 对应 xxx_PositiveZ,这与 Cubemap 中的对应关系相反;Left、Right、Up、Down 的对应关系与 Cubemap 一致。

        3)全局天空盒子

        在菜单栏依次点击【Window → Rendering → Lighting】,选择 Enviroment 选项卡,设置天空盒子材质如下:

        该设置会对项目中所有相机生效。 

        4)局部天空盒子

        如果用户不想使用全局天空盒子,可以使用局部天空盒子覆盖掉。给相机对象添加 Skybox 组件,并将天空盒子材质拖拽到其中,如下:

        5)运行效果

        说明:效果图中展示的不是模型,是 6 张纹理构成的天空盒子效果,相机的远近不会改变其大小,无论相机如何移动,相机始终处于天空盒子的中心。

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

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

相关文章

X3运行paddle-lite Demo

仓库地址GitHub - PaddlePaddle/Paddle-Lite-Demo at master git clone直接下载到X3上 环境准备 $ sudo apt-get update $ sudo apt-get install gcc g make wget unzip libopencv-dev pkg-config $ wget https://www.cmake.org/files/v3.10/cmake-3.10.3.tar.gz $ tar -zxvf …

Node.js--》深入理解 PM2:Node.js 应用部署和管理利器

目录 pm2&#xff1a;进程自动化管理工具 pm2的安装与使用 pm2&#xff1a;进程自动化管理工具 PM2&#xff1a;是一个流行的Node.js进程管理器&#xff0c;它可以帮助您在生产环境中管理和保持Node.js应用程序运行。PM2的功能包括监视您的应用程序、自动重启您的应用程序、…

手撕代码——异步FIFO

手撕代码——异步FIFO 一、异步FIFO原理与设计读写地址指针控制读写地址指针跨时钟处理与空满信号判断读写地址与读写操作 二、完整代码与仿真文件三、仿真结果 一、异步FIFO原理与设计 在FIFO的设计中&#xff0c;无论是同步FIFO&#xff0c;还是异步FIFO&#xff0c;最最最最…

ChatGPT:4. 使用OpenAI API创建自己的AI网站:3. flask web框架将OpenAI 创作的图片显示在网页界面上

ChatGPT&#xff1a;4. 使用OpenAI API创建自己的AI网站&#xff1a;3. flask web框架将OpenAI 创作的图片显示在网页界面上 如果你还是一个OpenAI的小白&#xff0c;有OpenAI的账号&#xff0c;但想调用OpenAI的API搞一些有意思的事&#xff0c;那么这一系列的教程将仔细的为…

nginx缓存

实验&#xff1a; 步骤一 tomcat1&&tomcat2部署&#xff1a; tomcat部署参照下面博客 (232条消息) Tomcat部署及优化_zhangchang3的博客-CSDN博客 两个网页入下图设计 步骤二 nginx 七层转发设置 编译安装nginx 修改配置文件 vim /usr/local/nginx/conf/nginx.…

5.21学习周报

文章目录 前言文献阅读摘要简介方法介绍讨论结论 时间序列预测 前言 本周阅读文献《Streamflow and rainfall forecasting by two long short-term memory-based models》&#xff0c;文献主要提出两种基于长短时记忆网络的混合模型用于对水流量和降雨量进行预测。小波-LSTM&a…

全网最全,性能测试-性能瓶颈分析详全,优秀的性能测试工程师养成记...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 内存分析 内存的…

06:mysql---约束

目录 1介绍 2:约束演示(建表) 3:外键约束 4:外建行为 5:外建是否可以删除 6:多表查询 1介绍 1:概念:约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 2:目的:保证数据库中数据的正确、有效性和完整性。 3:分类: 约束描述关键字非空约束限制…

ESP32S3---eFuse固化VDD_SPI释放GPIO45

使用esp-idf里面的esptool_py工具集吧.首先切换到工具所在目录. 比如WROOM设置(默认ttyUSB0或者ttyACM0): espefuse.py set_flash_voltage 3.3V 对于WROVER设置(默认ttyUSB0或者ttyACM0): espefuse.py set_flash_voltage 1.8V 运行后会提示你输入BURN,然后确认才能写,因为…

Vue电商项目--平台售卖属性和的排序操作制作

平台售卖属性的操作 就是点击平台的售卖属性&#xff0c;下面显示对应的内容 这里我们要借助这个props属性 这里块是平台的售卖属性&#xff0c;我们在这里绑定回调&#xff0c;一点击就把id传给父组件 我们需要把这俩个参数传进入 商品属性的数组: ["属性ID:属性值:…

FFmpeg学习:FFmpeg4数据结构分析

FFmpeg数据结构分析 FFMPEG中结构体很多。最关键的结构体可以分成以下几类&#xff1a; 1、解协议&#xff08;http,rtsp,rtmp,mms&#xff09; AVIOContext&#xff0c;URLProtocol&#xff0c;URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音…

【软件工程题库】第一章 软件工程概述

&#x1f57a;作者&#xff1a; 迷茫的启明星 学习路线C语言从0到1C初阶数据结构从0到1 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

View的事件分发机制

View的事件分发机制 View的事件分发机制主要分为三点 ,第一点是Activity将点击事件分发给ViewGroup 第二点是ViewGroup将事件自己处理或者分发给子View 第三点便是子View自行处理,或者子View处理不了转交给ViewGroup 现在依次来看 Activity对点击事件的分发过程 Activit…

运用go语言的模板(template)写的第一个程序示例

一、模板&#xff08;template&#xff09;与渲染 模板其实就相当于一个简历模板&#xff0c;上面的格式都是已经确定了的渲染就是往对应的地方填写相应的数据 二、模板 模板文件通常定义为.tmpl和.tpl为后缀&#xff08;也可以使用其他的后缀&#xff09;&#xff0c;必须…

手把手带你利用苹果手机使用美区礼品卡升级ChatGPT Plus,轻松搞定!

大家好&#xff0c;我是五竹。 昨天用苹果手机尝试了一下&#xff0c;借助App Store&#xff08;苹果应用商店&#xff09;升级 Plus&#xff0c;成功了&#xff01;一共升级了三个号&#xff01;有两个一气呵成&#xff0c;轻松搞定。最后一个可能触发风控了&#xff0c;但第…

OOB配对原理及应用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言一、OOB是啥&#xff1f;二、OOB配对实践总结 前言 本文先简单介绍OOB配对的流程&#xff0c;然后结合CC2652蓝牙芯片调试OOB配对 一、OOB是啥&#xff1f; OOB就是…

博客系统后端设计(六) -实现登录页面要求强制登录功能

文章目录 实现页面要求强制登录实现思路1.约定前后端交互接口2.实现后端代码3.修改前端代码 实现页面要求强制登录 当用户访问列表页/详情页/编辑页的时候&#xff0c;要求用户已经是登录的状态了&#xff0c; 如果用户还没登录&#xff0c;就会强制跳转到登录页面。 实现思路…

一文盘点PoseiSwap近期的生态利好

PoseiSwap 是 Nautilus Chain 上首个 DEX&#xff0c;其继承了 Nautilus Chain 的模块化、Layer3 以及 Zk-rollup 所带来的优势&#xff08;TPS 在 2000&#xff09;&#xff0c;包括吞吐量、安全度、隐私性等。基于 Nautilus Chain&#xff0c;PoseiSwap 也将具备基于 Zk 的隐…

Ceph crush运行图

Crush map介绍 ceph集群中由monitor负责维护的运行图包括&#xff1a; Monitor map&#xff1a;监视器运行图osd map&#xff1a;osd运行图PG map&#xff1a;PG运行图Crush map&#xff1a;crush运行图Mds map&#xff1a;mds运行图 crush map是ceph集群物理拓扑的抽象&…

HTML、PHP实战:搭建一个网页登录页面。

一、实验环境。 MySQL5.7.26 FTP0.9.60 Apache2.4.39 我这里用的是PHPstudy小皮一键搭建的。 数据库 二、登录页面。 登录页面前端代码 文件名&#xff1a;denglu.html <html> <head> <meta charset"UTF-8"> <title>登录界面</ti…