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

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

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

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<Camera>().RenderToCubemap(cubemap);

        DestroyImmediate(go);
    }

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

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

就到这里了,谢谢.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值