ShaderLab学习小结(十九)RenderToCubemap创建能反射周围环境的效果

继续用“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里,就不赘述了

原文地址:http://blog.51cto.com/shuxiayeshou/2071061

时间: 2024-10-09 12:02:03

ShaderLab学习小结(十九)RenderToCubemap创建能反射周围环境的效果的相关文章

angular学习笔记(十九)

本篇主要介绍angular使用指令修改DOM: 使用angular指令可以自己扩展html语法,还可以做很多自定义的事情.在后面会专门讲解这一块的知识,这一篇只是起到了解入门的作用. 与控制器,过滤器,服务,一样,可以通过模块实例的directive的方法来创建指令: var someModule = angular.module('SomeModule',[]); someModule.directive('directiveName',function(){ return { link: f

C++语言学习(十九)——C++类型识别

C++语言学习(十九)--C++类型识别 一.C++类型识别简介 1.C++类型识别简介 C++是静态类型语言,其数据类型是在编译期就确定的,不能在运行时更改.C++语言中,静态类型是对象自身的类型,动态类型是指针(引用)所指向对象的实际类型.RTTI(Run-Time Type Information)即运行时类型识别,C++通过RTTI实现对多态的支持.为了支持RTTI,C++提供了一个type_info类和typeid与dynamic_cast两个关键字. 2.type_info结构体 t

ShaderLab学习小结(四)简单产生阴影

在之前"ShaderLab学习小结(三)漫反射+高光+点光源请添加链接描述"中的场景加入一个plane,如下图:被平行光和点光源照射的球体没有产生阴影代码方面很好解决,就是在原先的shader最末尾加个fallback即可 Shader "shadername"{ SubShader{} fallback "Diffuse" } 效果如下图:在两个光源照射下,球体产生了阴影,并投射到下面的plane上.注:plane用的是系统默认的standar

ShaderLab学习小结(六)接收点光源阴影

运行环境:Win10 x64Unity 5.5.4在"ShaderLab学习小结(五)接收平行光阴影"中,通过修改代码,让原来的shader可以接收主平行光的阴影.但是没有点光源的阴影. 在原有的pass通道下面再添加一个pass通道,用于接收点光源阴影.直接将原来的pass复制粘贴成新的pass通道,再进行一些修改即可. pass { tags{ "lightmode" = "forwardadd" } //1. blend one one /

ShaderLab学习小结(五)接收平行光阴影

运行环境:Win10 x64Unity 5.5.4在"ShaderLab学习小结(四)简单产生阴影"基础上,在顶点片断着色器中编写程序使材质能接收阴影将小结(四)中添加的plane的材质换成和球体一样,即用相同的shader,效果如下:阴影消失.球的shader代码没有改动,也就是说球应该是产生阴影了,但是底下的plane也换成球的材质,接收不到阴影.那就要修改shader让它能接收阴影.Shader代码: Shader "Custom/DifSpecPoint"

ShaderLab学习小结(十二)简单的半透明shader

目标:两个cube,一个在前一个在后,前面的半透,透过前面可以看到后面的,而且颜色是有叠加的如下图:后一个cube就是默认的材质,不用变化,主要看前一个cube这个shader很简单Shader代码: Shader "Custom/TestTransShader" { Properties{ _Alpha("Alpha",range(0,1)) = 0.5 //1. } SubShader { tags{ "queue" = "tran

ShaderLab学习小结(十六)泡泡

一个球体,不论从哪去看,都是中心透明,向边上越来越不透,最后纯白,大概就像个泡泡一样效果如下图:先看shader代码: Shader "Custom/PaoPao" { //1. Properties{ _MainColor("Main",color)=(1,1,1,1) _Scale("Scale",range(1,8))=1 } SubShader { Tags{"queue"="Transparent"

ShaderLab学习小结(十八)cubemap

现在还没用到cubemap(除了天空盒子),只是初步的学了一下最简单的cubemap的shader找一幅图好吧,有点大,在unity里把它设置成cubemapOK,图有了,看shader,代码挺简单的,其实和普通的2D贴图shader挺像 Shader "Custom/Cubemap" { Properties { _Cube ("Cubemap", cube) = "" {} //1. } SubShader { pass { CGPROGRA

【转】JMeter学习(十九)JMeter测试MongoDB

JMeter测试MongoDB性能有两种方式,一种是利用JMeter直接进行测试MongoDB,还有一种是写Java代码方式测试MongoDB性能. 第一种方法 1.编写Java代码,内容如下: package com.test.mongodb; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.UUID; import java.util.conc