标签:tput cubemap data- change surf net size 代码 share
先截出一个效果图:
要反射出周围世界
我们仅仅须要一个周围世界的cubemap
先来看反射的shader
首先声明变量:
_Cubemap 须要反射的cubemap
_ReflAmount 反射的强度
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_MainTint ("Diffuse Color", Color) = (1, 1, 1, 1)
_Cubemap ("CubeMap", CUBE) = ""{}
_ReflAmount ("Reflection Amount", Range(0.01, 1)) = 0.5
}还须要为input结构体添加一个參数
float3 worldRefl
worldRef 即为世界空间的反射向量
内置的worldRefl 来做立方图反射
struct Input {
float2 uv_MainTex;
float3 worldRefl;////worldRefl:即为世界空间的反射向量///内置的worldRefl 来做立方图反射(cubemap reflection)//为了计算反射
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex) * _MainTint;
o.Emission = texCUBE(_Cubemap, IN.worldRefl).rgb * _ReflAmount;
o.Albedo = c.rgb;
o.Alpha = c.a;
}
接下来要解决的问题就是实时。
假设我们能实时更新这个cubemap,就能够实时反射了。
接下来我们建立一个c#脚本
所有变量:
要更新的cubemap
public Cubemap cubmap;
这里须要注意:我们要新建立一个camera放在要反射的物体的位置上。成为要反射的物体的子物体
而不是main camera
public Camera cam;
这里的材质就是上面shader的材质
private Material curMat;
public Cubemap cubmap;
public Camera cam;
private Material curMat; void Start()
{
InvokeRepeating("UpdateChange", 1, 0.1f);
curMat = renderer.sharedMaterial;
}再建立这个 UpdateChange () 函数
保证相机的角度不变
cam.transform.rotation = Quaternion.identity;
这个是我们的核心函数。
RenderToCubemap渲染到立方图,烘焙场景的静态立方贴图,赋给參数
cam.camera.RenderToCubemap(cubmap);
再把这个cubemap传给上面shader的_Cubemap变量中,就做到了实时更新
curMat.SetTexture("_Cubemap", cubmap);
void UpdateChange()
{
cam.transform.rotation = Quaternion.identity;
cam.camera.RenderToCubemap(cubmap);
curMat.SetTexture("_Cubemap", cubmap);
}
ok。
先来看看效果:
从波动的水体就能看出来确实实时反射了周围的环境
再让我们分析一下效果与效率问题,
不可否认的是,这样的方法尽管能做到实时反射,可是确实非常“浪费”,并且清晰度高了会非常卡
看看cubemap的FaceSize值对效果的影响
32:
非常明显,32相当模糊。相当“锯齿”
64:
64也是非常模糊。可是比32的要好一些,已经有一些凹凸感了
128:
128的效果感觉还能够。可是不是特别清晰
256:
到256的时候能够说实在这么简单的场景里面刚好不卡。
在512时就有一点点卡了。
事实上256在游戏其中也不有用。
建议在128一下
512:
512已经非常清晰了,有一点点卡。
1024:
截这张1024时,我的unity差点儿卡的不动了,帧率不到10fps吧,= =;有点清晰的过头了
看1024卡的那么嚣张就没敢试2048的预计也和1024几乎相同。
以上就结束了,
本片不须要什么图片资源大家能够试试
下面所有代码:
c#;
using UnityEngine;
using System.Collections;
public class d_cubMap : MonoBehaviour
{
public Cubemap cubmap;
public Camera cam;
private Material curMat;
// Use this for initialization
void Start()
{
InvokeRepeating("UpdateChange", 1, 0.1f);
curMat = renderer.sharedMaterial;
}
void UpdateChange()
{
cam.transform.rotation = Quaternion.identity;
cam.camera.RenderToCubemap(cubmap);
curMat.SetTexture("_Cubemap", cubmap);
}
}
shader;
Shader "Custom/cubmap" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_MainTint ("Diffuse Color", Color) = (1, 1, 1, 1)
_Cubemap ("CubeMap", CUBE) = ""{}
_ReflAmount ("Reflection Amount", Range(0.01, 1)) = 0.5
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
samplerCUBE _Cubemap;
float4 _MainTint;
float _ReflAmount;
struct Input {
float2 uv_MainTex;
float3 worldRefl;////worldRefl:即为世界空间的反射向量///内置的worldRefl 来做立方图反射(cubemap reflection)//为了计算反射
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex) * _MainTint;
o.Emission = texCUBE(_Cubemap, IN.worldRefl).rgb * _ReflAmount;
// o.Albedo = texCUBE(_Cubemap, IN.worldRefl).rgb * _ReflAmount;//c.rgb;
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
---------by wolf96
标签:tput cubemap data- change surf net size 代码 share
原文地址:http://www.cnblogs.com/jzdwajue/p/7124415.html