《Unity Shader》10.1.2 创建用于环境映射的立方体纹理

准备 RenderCubemapWizard.cs 的代码。由于该代码需要添加菜单栏条目,因此我们需要把它放在Editor文件夹下才能正确执行。当准备好上述代码后,要创建一个Cubemap非常简单。

编辑器类脚本,必须放在 Assets/Editor 资源目录中。此文件夹下的脚本只对编辑器进行操作。最后资源打包,Editor文件夹下的所有资源都不会被打包到工程中。

先create-folder 创建 Editor 文件夹

create-c# script 创建RenderCubemapWizard

但是有一个问题,创建了 C#文件之后,报错

解决方法是在 unity hub 里重新安装 unity。如下图,就没有报错了。

https://github.com/candycat1992/Unity_Shaders_Book/blob/master/Assets/Editor/Chapter10/RenderCubemapWizard.cs

RenderCubemapWizard.cs

java 复制代码
using UnityEngine;
using UnityEditor;
using System.Collections;

public class RenderCubemapWizard : ScriptableWizard {
	
	public Transform renderFromPosition;
	public Cubemap cubemap;
	
	void OnWizardUpdate () {
		helpString = "Select transform to render from and cubemap to render into";
		isValid = (renderFromPosition != null) && (cubemap != null);
	}
	
	void OnWizardCreate () {
		// create temporary camera for rendering
		GameObject go = new GameObject( "CubemapCamera");
		go.AddComponent<Camera>();
		// place it on the object
		go.transform.position = renderFromPosition.position;
		// render into cubemap		
		go.GetComponent<Camera>().RenderToCubemap(cubemap);
		
		// destroy temporary camera
		DestroyImmediate( go );
	}
	
	[MenuItem("GameObject/Render into Cubemap")]
	static void RenderCubemap () {
		ScriptableWizard.DisplayWizard<RenderCubemapWizard>(
			"Render cubemap", "Render!");
	}
}

(1)我们使用和10.1.1节中相同的场景,并创建一个空的GameObject对象。我们会使用该GameObject的位置信息来渲染立方体纹理。

(2)新建一个用于存储的立方体纹理(在Project视图下单击右键,选择Create → Legacy →Cubemap来创建)。在本书资源中,该立方体纹理名为Cubemap_0。为了让脚本可以顺利将图像渲染到该立方体纹理中,我们需要在它的面板中勾选Readable选项。

(3)从Unity菜单栏选择GameObject -> Render into Cubemap,打开我们在脚本中实现的用于渲染立方体纹理的窗口,并把第1步中创建的GameObject和第2步中创建的Cubemap_0分别拖曳到窗口中的Render From Position和Cubemap选项,如图10.5所示。

(4)单击窗口中的Render!按钮,就可以把从该位置观察到的世界空间下的6张图像渲染到Cubemap_0中,如图10.6所示。需要注意的是,我们需要为Cubemap设置大小,即图10.6中的Face size选项。Face size值越大,渲染出来的立方体纹理分辨率越大,效果可能更好,但需要占用的内存也越大,这可以由面板最下方显示的内存大小得到。

准备好了需要的立方体纹理后,我们就可以对物体使用环境映射技术。而环境映射最常见的应用就是反射和折射。

相关推荐
小贺儿开发11 小时前
Unity 家居视频遥控(细节优化)
科技·unity·程序员·udp·视频·工具·通信
淡海水11 小时前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
小小数媒成员1 天前
UGUI 性能优化(详细,全,深入)
开发语言·unity·游戏引擎
林川~012 天前
Unity新输入系统使用笔记
unity·input system
小贺儿开发2 天前
Unity 结合百度AI开放平台 手写文字识别
人工智能·科技·学习·unity·云服务·文字识别·手写文字
goujunwe2 天前
GEO 评估方法:如何自测你的内容,会不会被 AI 引用
搜索引擎·网络安全·游戏引擎·全文检索·中文分词
林川~012 天前
Unity 万能物理检测工具:射线检测 / 范围检测 / 层级过滤 / 编辑器可视化(可直接拿去用)
游戏·unity·c#·射线检测·通用工具
yi碗汤园3 天前
MQTT消息队列遥测传输协议
网络·网络协议·unity
林川~013 天前
Unity 常用 API 与核心类全解:从生命周期到协程,附性能避坑清单(Unity 6 适配)
unity·游戏引擎·常用api
sensen_kiss3 天前
CPT306 Coursework 1 个人游戏作业——坦克大战
unity·游戏程序·游戏策划