shader反射——立方体贴图

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wodownload2/article/details/88952593

创建立方体贴图的工具代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class CubeMapTool :  EditorWindow
{

    private Cubemap cubeMap = null;

    [MenuItem("Tools/CubeMapGenerate")]
    public static void GenerateCubeMap()
    {
        GetWindow<CubeMapTool>();
    }

    private void OnGUI()
    {
        cubeMap = EditorGUILayout.ObjectField(cubeMap, typeof(Cubemap), false, GUILayout.Width(400)) as Cubemap;
        if(GUILayout.Button("Render to Cube Map"))
        {
            SceneView.lastActiveSceneView.camera.RenderToCubemap(cubeMap);
        }
    }
}

右键创建一个立方体贴图,这种方式已经过时了。

在这里插入图片描述

将其设置为可读写。

在这里插入图片描述

然后通过上面的工具即可渲染到当前场景到一个立方体贴图了。
在这里插入图片描述

下面是使用这个立方体贴图的shader:

Shader "Unlit/CubeMapReflection"
{
	Properties
	{
		_CubeTex("Cube Tex", Cube) = "" {}
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			struct v2f
			{
				float4 vertex : SV_POSITION;
				float3 reflectionDir : TEXCOORD0;
			};

			samplerCUBE	_CubeTex;
			
			v2f vert (appdata_base v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				float3 worldNormal = UnityObjectToWorldNormal(v.normal);
				float3 worldViewDir = WorldSpaceViewDir(v.vertex);
				o.reflectionDir = reflect(-worldViewDir, worldNormal);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = texCUBE(_CubeTex, i.reflectionDir);
				return col;
			} 
			ENDCG
		}
	}
}

效果如下:

在这里插入图片描述

项目地址:
https://gitee.com/yichichunshui/CubeMap.git

猜你喜欢

转载自blog.csdn.net/wodownload2/article/details/88952593