继续用“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);    //4mat.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里,就不赘述了

转载于:https://blog.51cto.com/shuxiayeshou/2071061

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

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

    C++语言学习(十九)--C++类型识别 一.C++类型识别简介 1.C++类型识别简介 C++是静态类型语言,其数据类型是在编译期就确定的,不能在运行时更改. C++语言中,静态类型是对象自身的类型 ...

  2. Python-opencv学习第二十九课:高斯双边模糊

    Python-opencv学习第二十九课:高斯双边模糊 文章目录 Python-opencv学习第二十九课:高斯双边模糊 一.学习部分 二.代码部分 1.引入库 2.读入数据 3.完整代码 三.运行结 ...

  3. Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法

    Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法 把开发手册理了一遍,发现还有几个点没有记录下来,其中一个就是使用点对的粗对齐和使用参考目标的精确对齐.为了把这个学习笔记凑够 ...

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

    运行环境: Win10 x64 Unity 5.5.4 在之前"ShaderLab学习小结(三)漫反射+高光+点光源"中的场景加入一个plane,如下图: 被平行光和点光源照射的球 ...

  5. 花书+吴恩达深度学习(十九)构建模型策略(训练模型顺序、偏差方差、数据集划分、数据不匹配)

    目录 0. 前言 1. 调试模型顺序 2. 偏差方差的解决方法 3. 数据集的选取划分 4. 数据不匹配问题 5. 评估指标的选取 6. 贝叶斯最佳误差 如果这篇文章对你有一点小小的帮助,请给个关注, ...

  6. 风炫安全web安全学习第二十九节课 CSRF防御措施

    风炫安全web安全学习第二十九节课 CSRF防御措施 CSRF防御措施 增加token验证 对关键操作增加token验证,token值必须随机,每次都不一样 关于安全的会话管理(SESSION) 不要 ...

  7. 推荐系统遇上深度学习(三十九)-推荐系统中召回策略演进!

    推荐系统中的核心是从海量的商品库挑选合适商品最终展示给用户.由于商品库数量巨大,因此常见的推荐系统一般分为两个阶段,即召回阶段和排序阶段.召回阶段主要是从全量的商品库中得到用户可能感兴趣的一小部分候选 ...

  8. STM32学习心得十九:电容触摸按键实验及相关代码解读

    记录一下,方便以后翻阅~ 主要内容 1) 电容触摸按键原理: 2)部分实验代码解读. 实验内容 手触摸按键后,LED1灯翻转. 硬件原理图 上图,TPAD与STM_ADC用跳线帽相连,即TPAD与PA ...

  9. Mr.J-- jQuery学习笔记(十九)--自定义动画实现图标特效

    之前有写过自定义动画Mr.J-- jQuery学习笔记(十八)--自定义动画 这次实现一个小demo 图标特效 页面渲染 <!DOCTYPE html> <html lang=&qu ...

最新文章

  1. 网管日志-06.09.08
  2. 滚动数组~\(≧▽≦)/~
  3. ab压力测试(了解ab工具,实验对网页进行测试)
  4. 使用 CliWrap 让C#中的命令行交互举重若轻
  5. 春考天津计算机知识点,天津春季高考计算机模拟试题
  6. C++基础篇之抽象类的接口
  7. Tomcat+MySql+jdbc
  8. JDBC概念和数据库驱动程序操作基础
  9. 自控原理学习笔记-反馈控制系统的动态模型(3)-开环、闭环特征模型
  10. 设计模式-02原型模式
  11. 掌握常用传感器的工作原理应用技术-斯巴托(1)
  12. ARM Neon Intrinsics 学习指北:从入门、进阶到学个通透
  13. 单片机程序运行在哪里
  14. Python基础必掌握的5种数据类型和8种内置函数基本操作
  15. Stack Overflow 食用指南
  16. 【C4】【搜索】拔河比赛
  17. 卸载Navicat!操作所有的数据库靠它就够了
  18. 反病毒理念、历史、现状与未来
  19. Kaili Linux系统修改mac地址(ubuntu等其它系统也同理)
  20. 84-MongoDB高级介绍

热门文章

  1. c语言删除结构体数组的数据库,结构体数组的删除问题
  2. linux上设置了log4j没有产生日志文件_关于 log4j 升级到 log4j2 的小结
  3. Java基础:JDK1.5新特性
  4. 中专计算机应用,中专计算机应用论文
  5. android 写字体投影,android之字体阴影效果
  6. 数据库系统概论:第七章 数据库设计
  7. 现代操作系统: 第九章 安全
  8. Redis的数据类型详解
  9. 让Apache支持Rewrite静态页面重写的方法
  10. 循环链表的插入和删除