在Unity3D中创建反射纹理

距离上次技术相关的博文有半年了吧。。。这次回来了,会坚持下去。
说到反射纹理,本质上就是创建一个 CubeMap 立方体贴图, 把需要被反射的目标渲染的6个纹理上, 然后反射的物体根据自身的法线方向在对应的6个面上进行采样。
一步一步来

首先创建一个CubeMap纹理
在project面板上右键->Create->Legacy->CubeMap
然后在Inspector面板上将前后左右上下的纹理添加进去 like this..
cubemaptex
创建好后,不如把它作为天空盒吧,这样到时候反射物体可以直接反射周围的天空的说,说干就干。。
首选创建一个材质,设置材质的Shader为skybox->Cubemap,然后把刚才创建的纹理赋予它 like this
cubemapmat
打开菜单 Window->Lighting 将创建的材质放入 SkyBox槽位,我们就能看见天空啦
skyboxview

之后我们需要编写一个Shader来对天空盒的cubemap 进行采样,就是反射啦

Shader "Custom/CubeMap" {
    Properties {
        _Cube("Reflection Map", Cube) = "" {}
    }
    SubShader {
        Pass
        {
            CGPROGRAM
            #pragma  vertex vert
            #pragma  fragment frag

            #include "UnityCG.cginc"

            uniform samplerCUBE _Cube;

            struct vertexInput
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };

            struct vertexOutput
            {
                float4 pos : SV_POSITION;
                float3 normalDir : TEXCOORD0;
                float3 viewDir : TEXCOORD1;
            };

            vertexOutput vert(vertexInput input)
            {
                vertexOutput output;
               
                float4x4 modelMatrix = _Object2World;
                float4x4 modelMatrixInverse = _World2Object;

                //计算视野方向,世界空间顶点与世界空间内相机位置相减
                output.viewDir = mul(modelMatrix, input.vertex).xyz - _WorldSpaceCameraPos;
                //将法线从模型空间也统一转换到世界空间
                output.normalDir = normalize(mul(float4(input.normal, 0.0), modelMatrixInverse).xyz);
                output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
                return output;
            }

            float4 frag(vertexOutput input) :COLOR
            {
                //计算视线方向与法线法线方向的反射向量
                float3 reflectDir = reflect(input.viewDir, input.normalDir);
                //texCUBE是CubeMap采样,tex2D是2D纹理采样
                return texCUBE(_Cube, reflectDir);
            }

            ENDCG
        }
    }
    FallBack "Diffuse"
}

继续阅读“在Unity3D中创建反射纹理”