《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值越大,渲染出来的立方体纹理分辨率越大,效果可能更好,但需要占用的内存也越大,这可以由面板最下方显示的内存大小得到。

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

相关推荐
猫不吃咸鱼2 小时前
Unity中攻击检测敌人的多种方法
游戏·unity·c#·游戏引擎
又来0772 小时前
Unity 无人机物理模拟开发日志:从零打造穿越机手感
unity·游戏引擎·无人机
CreasyChan4 小时前
Unity UniRx Observable 类详解及使用
游戏·unity·c#·游戏引擎
老朱佩琪!7 小时前
Unity策略模式
unity·设计模式·策略模式
老朱佩琪!1 天前
Unity备忘录模式
java·unity·备忘录模式
一帘多啦A梦1 天前
解决unity2022.3.x版本项目使用vs无法生成解决方案的问题
unity·vs
weixin_424294671 天前
Unity LocalPosition 和 Position 的区别?还有其他的Position 没?
unity·游戏引擎
UX20171 天前
Git LFS 管理 Unity 大文件
git·unity
nnsix1 天前
Unity WebGL端调用Windows窗口选择文件
unity·游戏引擎·webgl
向宇it1 天前
【unity游戏开发——网络】使用Unity+PurrNet+Heathens+Steam,在 Unity 中通过 Steam与你的朋友建立联系
网络·游戏·unity·c#·游戏引擎·steam