zoukankan      html  css  js  c++  java
  • 【Unity渲染】Camera RenderToCubemap 渲染到立方体纹理

    Unity圣典 传送门:http://www.ceeger.com/Script/Camera/Camera.RenderToCubemap.html

    Camera.RenderToCubemap 有4个重载

    (1)bool  RenderToCubemap(Cubemap cubemap)

        bool  RenderToCubemap(Cubemap cubemap,int faceMask)

      可以用于在编辑器中生成场景静态立方体贴图。faceMask是一个bitfield比特数,表示那个立方贴图面应该被渲染,每个位对

    应于一个面。比特数是Cubemapface枚举的整型值。默认的所有六个立方贴图面都被渲染(默认值63的低6位是打开的)。

     1 // Render scene from a given point into a static cube map.
     2 //从给定的点渲染场景到以静态立方贴图
     3 // Place this script in Editor folder of your project.
     4 //放置这个脚本到工程的Editor文件夹中
     5 // Then use the cubemap with one of Reflective shaders!
     6 //然后用一个Reflective shaders 来使用这个立方贴图
     7 class RenderCubemapWizard extends ScriptableWizard {
     8     var renderFromPosition : Transform;
     9     var cubemap : Cubemap;
    10 
    11     function OnWizardUpdate () {
    12         helpString = "Select transform to render from and cubemap to render into";
    13         isValid = (renderFromPosition != null) && (cubemap != null);
    14     }
    15 
    16     function OnWizardCreate () {
    17         // create temporary camera for rendering
    18         //为渲染创建临时相机
    19         var go = new GameObject( "CubemapCamera", Camera );
    20         // place it on the object
    21         //放置它到物体上
    22         go.transform.position = renderFromPosition.position;
    23         go.transform.rotation = Quaternion.identity;
    24 
    25         // render into cubemap
    26         //渲染到立方贴图    
    27         go.camera.RenderToCubemap( cubemap );
    28 
    29         // destroy temporary camera
    30         //销毁临时相机
    31         DestroyImmediate( go );
    32     }
    33 
    34     @MenuItem("GameObject/Render into Cubemap")
    35     static function RenderCubemap () {
    36         ScriptableWizard.DisplayWizard.<RenderCubemapWizard>(
    37         "Render cubemap", "Render!");
    38     }
    39 }

    (2)bool  RenderToCubemap(RenderTexture cubemap)

             bool  RenderToCubemap(RenderTexture cubemap,int faceMask)

            这个用于实时反射到立方贴图渲染纹理。这是非常耗时的,尤其是所有六个立方贴图面在每一帧中都被渲染。

    如果渲染失败这个函数将返回false,某些显卡不支持这个函数。

      同时,一定要将 RenderTexture.isCubemap = true

     1 using UnityEngine;
     2 using System.Collections;
     3 using UnityEngine.UI;
     4 using UnityEditor;
     5 
     6 // Attach this script to an object that uses a Reflective shader.
     7 // Realtime reflective cubemaps!
     8 //附加这个脚本到使用了Reflective shader的物体上 
     9 //实时反射立方贴图
    10 [ExecuteInEditMode]
    11 public class RealtimeCubemap :MonoBehaviour
    12 {
    13     int cubemapSize = 128;
    14     //一帧渲染一面
    15     bool oneFacePerFrame = false; 
    16     Camera cam = null;
    17     RenderTexture cubemap = null;
    18     Material mat = null;
    19 
    20     void Start()
    21     {
    22         //在启动时渲染所有六个面
    23         UpdateCubemap(63);
    24     }
    25 
    26     void LateUpdate()
    27     {
    28         if (oneFacePerFrame)
    29         {
    30             int faceToRender = Time.frameCount % 6;
    31             int faceMask = 1 << faceToRender;
    32             UpdateCubemap(faceMask);
    33         }
    34         else
    35         {
    36             //所有六个面
    37             UpdateCubemap(63);
    38         }
    39     }
    40 
    41     
    42 void UpdateCubemap (int faceMask )
    43 {
    44     if (cam == null)
    45     {
    46         GameObject go = new GameObject("CubemapCamera", typeof(Camera));
    47 
    48         //隐藏在场景中
    49         go.hideFlags = HideFlags.HideAndDontSave;
    50         go.transform.position = transform.position;
    51         go.transform.rotation = Quaternion.identity;
    52         cam = go.GetComponent<Camera>();
    53 
    54         ///不要渲染较远的部分
    55         cam.farClipPlane = 100;
    56         cam.enabled = false;
    57     }
    58     if (mat == null)
    59     {
    60         mat = new Material(Shader.Find("Custom/RealtimeCubemap"));
    61         mat.hideFlags = HideFlags.HideAndDontSave;
    62         GetComponent<Renderer>().material = mat;
    63     }
    64 
    65     if (cubemap == null)
    66     {
    67         cubemap = new RenderTexture(cubemapSize, cubemapSize, 16);
    68         cubemap.isPowerOfTwo = true;
    69         cubemap.isCubemap = true;
    70         cubemap.hideFlags = HideFlags.HideAndDontSave;
    71         mat.SetTexture("_Cubemap", cubemap);
    72     }
    73 
    74     cam.transform.position = transform.position;
    75     cam.RenderToCubemap(cubemap, faceMask);
    76 }
    77 
    78     void OnDisable()
    79     {
    80         DestroyImmediate(cam);
    81         DestroyImmediate(cubemap);
    82     }
    83 
    84 }
  • 相关阅读:
    POJ1486 Sorting Slides 二分图or贪心
    POJ2060 Taxi Cab Scheme 最小路径覆盖
    POJ3083 Children of the Candy Corn 解题报告
    以前的文章
    POJ2449 Remmarguts' Date K短路经典题
    这一年的acm路
    POJ3014 Asteroids 最小点覆盖
    POJ2594 Treasure Exploration 最小路径覆盖
    POJ3009 Curling 2.0 解题报告
    POJ2226 Muddy Fields 最小点集覆盖
  • 原文地址:https://www.cnblogs.com/nanwei/p/7289960.html
Copyright © 2011-2022 走看看