Surface Shader  Cubemap

1. Å¥ºê¸Ê »ý¼º


- Å¥ºê¸Ê »ý¼º ½ºÅ©¸³Æ® ÀÛ¼º
½ºÅ©¸³Æ®¸¦ ¸¸µé¾î Assets/Editor Æú´õ¿¡ ³Ö´Â´Ù.
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;
        go.transform.rotation = Quaternion.identity;
        // 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!");
    }
}

- Å¥ºê¸Ê ¿ÀºêÁ§Æ® »ý¼º
¸Þ´º > Assets > Create > Legacy > Cubemap


- Å¥ºê¸Ê »ý¼º ½ºÅ©¸³Æ® ½ÇÇà
¸Þ´º > GameObject > "Render into Cubemap" ½ÇÇà
À§Ä¡¿Í ÀúÀåÇÒ Å¥ºê¸ÊÀ» ¼³Á¤ÇÑ´Ù.



- Å¥ºê¸Ê »ý¼º °á°ú È®ÀÎ
Å¥ºê¸ÊÀ» »ý¼ºÈÄ °á°ú¸¦ È®ÀÎ ÇÒ·Á¸é ÀνºÆåÆ®ºä°¡ ÀÚµ¿ ¾÷µ¥ÀÌÆ®°¡ ¾ÈµÈ´Ù.
ÀνºÆåÆ®ºä¿¡ ´Ù¸¥ ¼Ó¼ºÀ» º¸¿©ÁØÈÄ¿¡ ´Ù½Ã »ý¼ºµÈ Å¥ºê¸ÊÀ» Ŭ¸¯ÇÑ´Ù.



2. Å¥ºê¸Ê ·»´õ¸µ


- Å¥ºê¸ÊÀ» ·ÎµùÇÏ°í ¹Ý»ç·®À» Á¶Á¤ÇÏ´Â _Cubemap, _ReflAmount¸¦ Ãß°¡ÇÑ´Ù.

    Properties
    {
        _MainTint ("Diffuse Tint", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _Cubemap ("CubeMap", CUBE) = ""{}
        _ReflAmount ("Reflection Amount", Range(0.01, 1)) = 0.5
    }

        sampler2D _MainTex;
        samplerCUBE _Cubemap;
        float4 _MainTint;
        float _ReflAmount;

- ÀÔ·Â ±¸Á¶Ã¼¿¡ ¿ùµå¹Ý»çº¤Å͸¦ ³Ñ°ÜÁØ´Ù.
¿ùµå¹Ý»çº¤ÅÍ´Â À¯´ÏƼ ³»ºÎ¿¡¼­ Á¦°øÇÏ´Â ±â´ÉÀÌ´Ù.

        struct Input
        {
            float2 uv_MainTex;
            float3 worldRefl;
        };

- Å¥ºê¸ÊÀ» ·ÎµùÇÏ°í ¹Ý»çÄ«¿îÆ®¸¦ ¹Ý»ç·®À» °öÇÑ´Ù.
¿ùµå¹Ý»çº¤ÅÍ·Î ÅؽºÃÄ Á¤º¸¸¦ ±¸ÇÑ´Ù.

void surf (Input IN, inout SurfaceOutput o)
{
    half4 c = tex2D (_MainTex, IN.uv_MainTex) * _MainTint;
    o.Emission = texCUBE(_Cubemap, IN.worldRefl).rgb * _ReflAmount;
    o.Albedo = c.rgb;
    o.Alpha = c.a;
}

- ¼ÎÀÌ´õ Àüü ¼Ò½º´Â ´ÙÀ½°ú °°´Ù.

Shader "Custom/SimpleReflection"
{
    Properties
    {
        _MainTint ("Diffuse Tint", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _Cubemap ("CubeMap", CUBE) = ""{}
        _ReflAmount ("Reflection Amount", Range(0.01, 1)) = 0.5
    }
    
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _MainTex;
        samplerCUBE _Cubemap;
        float4 _MainTint;
        float _ReflAmount;

        struct Input
        {
            float2 uv_MainTex;
            float3 worldRefl;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            half4 c = tex2D (_MainTex, IN.uv_MainTex) * _MainTint;
            o.Emission = texCUBE(_Cubemap, IN.worldRefl).rgb * _ReflAmount;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

3. Å¥ºê¸Ê ¸¶½ºÅ·

Å¥ºê¸ÊÀ» ¸¶½ºÅ· ÇÒ·Á¸é ¸¶½ºÅ·¿ë Å¥ºê¸ÊÀ» Ãß°¡ÇØ¾ß ÇÑ´Ù.
texCUBE·Î ¸¶½ºÅ·¿ë Å¥ºê¸ÊÀ» ·ÎµùÈÄ ±âÁ¸ o.Emission °ª¿¡ °öÇÏ¸é µÈ´Ù.

Âü°í)
À¯´ÏƼ Shader¿Í Effect Á¦ÀÛ (¿¡ÀÌÄÜ ÃâÆÇ»ç)
http://docs.unity3d.com/ScriptReference/Camera.RenderToCubemap.html
https://gist.github.com/robinkruyt/55701f2129f203a473e3

< ¸®Ç÷º¼Ç º¤ÅÍ °è»ê >