神临的unity shader 学习之环境反射贴图Cubemap(五)

这次是的说立方体贴图
在日常生活中,我们能够看到像金属状,玻璃状物体能够在表面反射出周围环境的样子,而立方体贴图的使用就是如此,用到玻璃窗,汽车车表面(车漆),就会显示出极其逼真的效果,当然这是一种方法一般是用在提前制作好CubeMap贴图,如果追求更高的话,就要用照相机实时的渲染贴图了,比如下面这张图,就是这种效果的极好的表现.
神临的unity shader 学习之环境反射贴图Cubemap(五)_第1张图片

很清晰的反映了周围环境的光彩.
那么上代码了.

Shader"MyCubemap"
{
  Properties
  {
    _MainTex("Base texture",2D)= "white"
    _Cubemap("Env map",CUBE)=""{}//(1)
  }

  SubShader
  {
    Tags{"RenderType"="Opaque"}
    LOD 200

    CGPROGRAM
    #pragma surface surf Lambert

    sampler2D _MainTex;
    samplerCUBE _Cubemap;//(2)

    struct Input
    {
      float2 uv_MainTex;
      float3 worldRefl;//(3)
    };

    void surf(Input IN,inout SurfaceOutput o)
    {
    fixed4 c = tex2D(_MainTex,IN.uv_MainTex);
    o.Albedo= c.rgb;

    fixed4 reflcol = texCUBE(_Cubemap,IN.worldRefl);//(4)
    reflcol *= c.a;//(5)
    o.Emission = reflcol.rgb;
    o.Alpha = reflcol.a;
    }
    ENDCG
  }
}

(1) 这里是调用外部CubeMap贴图的接口,至于CubeMap怎么制作,可以有美工人员定制,也可以自己手动去制作,方法很简单,只要执行以下C#代码就行了,代码我会在最后给出.

(2)声明变量,这里就不用解释了吧.

(3)获得视线在世界坐标下反射位置的坐标,以供采样使用

(4)texCUBE采样计算,unity内置好的,这里可以去看看内置的CG,了解一下

(5)与纹理贴图的Alpha混合,以防止在在纹理贴图透明时出现CubeMap的内容,使表现更平衡.

现在给上大家关于在unity中制作Cubemap的代码


using UnityEngine;
using UnityEditor;
using System.Collections;

public class GenerateStaticCubemap : ScriptableWizard
{

    public Transform renderPosition;
    public Cubemap cubemap;

    void OnWizardUpdate()
    {
        helpString = "Select transform to render" +
                       " from and cubemap to render into";
        if (renderPosition != null && cubemap != null)
        {
            isValid = true;
        }
        else
        {
            isValid = false;
        }
    }

    void OnWizardCreate()
    {
        GameObject go = new GameObject("CubeCam", typeof(Camera));

        go.transform.position = renderPosition.position;
        go.transform.rotation = Quaternion.identity;

        go.GetComponent().RenderToCubemap(cubemap);

        DestroyImmediate(go);
    }

    [MenuItem("CookBook/Render Cubemap")]
    static void RenderCubemap()
    {
        ScriptableWizard.DisplayWizard("Render CubeMap", typeof(GenerateStaticCubemap), "Render!");
    }
}

建立一个空的Cubemap,然后在建立一个空的gameobject (坐标与自己想要的贴图坐标一致),打开菜单栏的CookBook/Render Cubemap,放上去就行了.

就到这里了,谢谢.

你可能感兴趣的:(shader)