这次是的说立方体贴图
在日常生活中,我们能够看到像金属状,玻璃状物体能够在表面反射出周围环境的样子,而立方体贴图的使用就是如此,用到玻璃窗,汽车车表面(车漆),就会显示出极其逼真的效果,当然这是一种方法一般是用在提前制作好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().RenderToCubemap(cubemap);
DestroyImmediate(go);
}
[MenuItem("CookBook/Render Cubemap")]
static void RenderCubemap()
{
ScriptableWizard.DisplayWizard("Render CubeMap", typeof(GenerateStaticCubemap), "Render!");
}
}
建立一个空的Cubemap,然后在建立一个空的gameobject (坐标与自己想要的贴图坐标一致),打开菜单栏的CookBook/Render Cubemap,放上去就行了.
就到这里了,谢谢.