ShaderLab学习小结(十九)RenderToCubemap创建能反射周围环境的效果
  5WVVrgL6K2nc 2023年11月02日 22 0

继续用“ShaderLab学习小结(十八)cubemap”中所做的shader 想要让它能对周围的环境进行反射 思路就是要让它的cubemap里的内容是周围环境的映射 shader不变,就要想办法进行映射,这就要用到c#代码了 核心的方法是

public bool Camera.RenderToCubemap(RenderTexture cubemap)

顾名思义,这个是Camera的一个方法,渲染至cubemap 返回ture则渲染成功 看unity document中的说明 即从这个camera渲染出一张静态的cubemap 虽说camera能看到的也只是他的视方向上的物体,但这个方法显然是这个camera所在位置的上下左右前后 既然我们最后是要让这个渲染出来的cubemap赋在我们指定的这个球体上,那么这个camera的位置要和球体一样 即camera的位置在球心 而且,camera还不能看到这个球体,不然直接就被球挡住了吧 不过经过实验发现,camera并没有被球挡住,我想可能是背面剔除的原因,从球的内部向外看是看不见球的

我们先搭建一个简单的场景 如图,一个plane作地面,周围有一个拉长了的cube,一个capsule和一个cylinder 中间进行2倍缩放的球体就是我们要操作的对象了,它上面已经赋上了这个cubemap的shader,只是没给贴图 在他的位置(中心)建了一个camera 给camera上绑了一个c#脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SKRenderToCube : MonoBehaviour {
    public GameObject sph;   //1.
    private Camera cam;
	void Start () {
        cam = GetComponent<Camera>();
        if (sph != null)
        {
            Material mat = sph.GetComponent<Renderer>().material;
            if (mat != null)
            {
                RenderTexture cubemap = new RenderTexture(128, 128, 16);   //2.
                cubemap.dimension = UnityEngine.Rendering.TextureDimension.Cube;          //3.
                cam.RenderToCubemap(cubemap);    //4
                mat.SetTexture("_Cube", cubemap);   //5.
            }
        }
	}
}

按注释位置

1

这个是用于在unity中把球体拖过来,以便下面的代码能赋上值

2

 RenderTexture cubemap = new RenderTexture(128, 128, 16);   //2.

创建一个RenderTexture,这也是我们最后要赋到球体上的 128,128是宽高,16是depth颜色缓冲区深度吧,16位

3

 cubemap.dimension = UnityEngine.Rendering.TextureDimension.Cube;          //3.

这行应该就是确定此RenderTexture的类型是cubemap

4

cam.RenderToCubemap(cubemap);    //4

渲染

5

mat.SetTexture("_Cube", cubemap);   //5.

把渲染后的RenderTexture赋给球体

最终效果: 可见,球体表面反射了周围的环境,包括近处的物体和远处的天空 这里的代码是建立在场景不发生任何变化的情况之下的 如果有物体移动,或者缩放,或者出现、消失 或者光线变化,cubemap只是一开始生成了一次,是不会随着发生改变的 这样映射的结果就会出现错误 能想到的最直接的办法就是写在Update里,就不赘述了

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  jo5M4GCiOHdG   2023年11月12日   18   0   0 Unity教程Unity
5WVVrgL6K2nc