unity3d中玻璃反射周围环境怎么表现
答案:2 悬赏:10
解决时间 2021-04-22 02:43
- 提问者网友:白越
- 2021-04-21 07:05
unity3d中玻璃反射周围环境怎么表现
最佳答案
- 二级知识专家网友:糜废丧逼
- 2021-04-21 07:15
反射上面加个衰减.衰减类型用fresnel折射用纯白烟雾颜色是控制玻璃颜色的地方。
全部回答
- 1楼网友:两不相欠
- 2021-04-21 07:30
透明玻璃材质和镜面反射材质都是需要光影技术(shader)配合的,属于特效材质。
转给你个车身、玻璃材质的shader:
shader "reflective/glass" {
properties {
_color ("main color", color) = (1,1,1,1)
_speccolor ("specular color", color) = (0.5, 0.5, 0.5, 1)
_shininess ("shininess", range (0.01, 1)) = 0.078125
_reflectcolor ("reflect strength", color) = (1,1,1,0.5)
_maintex ("base (rgb) gloss (a)", 2d) = "white" {}
_parallax ("height", range (0.005, 0.08)) = 0.02
_cube ("reflection cubemap", cube) = "_skybox" { texgen cubereflect }
}
subshader
{
lod 300
tags { "queue"="transparent" "ignoreprojector"="true" "rendertype"="transparent"}
blend one oneminusdstcolor
zwrite off
// first pass does reflection cubemap
pass
{
name "base"
tags {"lightmode" = "always"}
cgprogram
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption arb_fog_exp2
#pragma fragmentoption arb_precision_hint_fastest
#include "unitycg.cginc"
struct v2f {
v2f_pos_fog;
float2 uv : texcoord0;
float3 i : texcoord1;
};
uniform float4 _maintex_st;
v2f vert(appdata_tan v)
{
v2f o;
positionfog( v.vertex, o.pos, o.fog );
o.uv = transform_tex(v.texcoord,_maintex);
// calculate object space reflection vector
float3 viewdir = objspaceviewdir( v.vertex );
float3 i = reflect( -viewdir, v.normal );
// transform to world space reflection vector
o.i = mul( (float3x3)_object2world, i );
return o;
}
uniform sampler2d _maintex;
uniform samplercube _cube;
uniform float4 _reflectcolor;
half4 frag (v2f i) : color
{
half4 texcol = tex2d (_maintex, i.uv);
half4 reflcol = texcube( _cube, i.i );
reflcol *= texcol.a;
return reflcol * _reflectcolor;
}
endcg
}
usepass "parallax specular/ppl"
}
fallback "reflective/vertexlit", 1
}
shader "reflective/glass" {
properties {
_color ("main color", color) = (1,1,1,1)
_speccolor ("specular color", color) = (0.5, 0.5, 0.5, 1)
_shininess ("shininess", range (0.01, 1)) = 0.078125
_reflectcolor ("reflect strength", color) = (1,1,1,0.5)
_maintex ("base (rgb) gloss (a)", 2d) = "white" {}
_parallax ("height", range (0.005, 0.08)) = 0.02
_cube ("reflection cubemap", cube) = "_skybox" { texgen cubereflect }
}
subshader
{
lod 300
tags { "queue"="transparent" "ignoreprojector"="true" "rendertype"="transparent"}
blend one oneminusdstcolor
zwrite off
// first pass does reflection cubemap
pass
{
name "base"
tags {"lightmode" = "always"}
cgprogram
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption arb_fog_exp2
#pragma fragmentoption arb_precision_hint_fastest
#include "unitycg.cginc"
struct v2f {
v2f_pos_fog;
float2 uv : texcoord0;
float3 i : texcoord1;
};
uniform float4 _maintex_st;
v2f vert(appdata_tan v)
{
v2f o;
positionfog( v.vertex, o.pos, o.fog );
o.uv = transform_tex(v.texcoord,_maintex);
// calculate object space reflection vector
float3 viewdir = objspaceviewdir( v.vertex );
float3 i = reflect( -viewdir, v.normal );
// transform to world space reflection vector
o.i = mul( (float3x3)_object2world, i );
return o;
}
uniform sampler2d _maintex;
uniform samplercube _cube;
uniform float4 _reflectcolor;
half4 frag (v2f i) : color
{
half4 texcol = tex2d (_maintex, i.uv);
half4 reflcol = texcube( _cube, i.i );
reflcol *= texcol.a;
return reflcol * _reflectcolor;
}
endcg
}
usepass "parallax specular/ppl"
}
fallback "reflective/vertexlit", 1
}
车身shader用reflective/specular中的一种
然后加入以下脚本:
rendertocubemap.js:
// attach this script to an object that uses a reflective shader.
// realtime reflective cubemaps!
@script executeineditmode
var cubemapsize = 128;
var onefaceperframe = false;
private var cam : camera;
private var rtex : rendertexture;
function start ()
{
// render all six faces at startup
updatecubemap( 63 );
}
function lateupdate ()
{
if (onefaceperframe)
{
var facetorender = time.framecount % 6;
var facemask = 1 << facetorender;
updatecubemap (facemask);
}
else
{
updatecubemap (63); // all six faces
}
}
function updatecubemap (facemask : int)
{
if (!cam)
{
var go = new gameobject ("cubemapcamera", camera);
go.hideflags = hideflags.hideanddontsave;
go.transform.position = transform.position;
go.transform.rotation = quaternion.identity;
cam = go.camera;
cam.farclipplane = 100; // don't render very far into cubemap
cam.enabled = false;
}
if (!rtex)
{
rtex = new rendertexture (cubemapsize, cubemapsize, 16);
rtex.ispoweroftwo = true;
rtex.iscubemap = true;
rtex.hideflags = hideflags.hideanddontsave;
renderer.sharedmaterial.settexture ("_cube", rtex);
}
cam.transform.position = transform.position;
cam.rendertocubemap (rtex, facemask);
}
function ondisable ()
{
destroyimmediate (cam);
destroyimmediate (rtex);
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |