创建立方体贴图的工具代码:
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
}
}
}
效果如下: