
2、就是在unity里再联结,这个要怎么做呢,其实也挺简单的,经常看Island Demo项目的人应该很早就注意到里面的石头这些都是连在一起的,原因就在这里,他提供了现成就脚本实现联结。菜鸟教育竭诚为您服务。mat = new Material( "Shader \"Hidden/Alpha\" {" +
"SubShader {" +
" Pass {" +
" ZTest Always Cull Off ZWrite Off" +
" Blend DstAlpha Zero" +
" Color (1,1,1,1)" +
" }" +
"}" +
"}"
);
这是代码新建的
如果是动态换,声明Material mat 然后gameObjectrenderermaterial = mat;unity3d有自己的材质系统,和max是不一样的,两者也不能共用,导入模型到unity,需要在unity里面自己调材质效果,多少情况下,自动的shader调调就行了,达不到想要的效果就自己写shader当导入的模型有多重材质时,unity3d中也会对应有多个材质球。
当然您也可以在unity3d中将物体的Materials-Size设为大于1的数,然后赋予多个材质,但是这样显然不会得到预期的效果。Unity自带的好多好包,新建项目时可以都勾选上,这样项目里面就会有你想要的大部分东西,
当你熟悉每个包里有那些对应的东西后,再次新建 项目 时就可以选需要的一此包,而不用全选。
如果还觉得不够 ,可以找开菜单-》Windows-》Assets Store上面有好多的资源,透明玻璃材质和镜面反射材质都是需要光影技术(Shader)配合的,属于特效材质。
转给你个车身、玻璃材质的shader:
Shader "Reflective/Glass" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_SpecColor ("Specular Color", Color) = (05, 05, 05, 1)
_Shininess ("Shininess", Range (001, 1)) = 0078125
_ReflectColor ("Reflect Strength", Color) = (1,1,1,05)
_MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
_Parallax ("Height", Range (0005, 008)) = 002
_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 "UnityCGcginc"
struct v2f {
V2F_POS_FOG;
float2 uv : TEXCOORD0;
float3 I : TEXCOORD1;
};
uniform float4 _MainTex_ST;
v2f vert(appdata_tan v)
{
v2f o;
PositionFog( vvertex, opos, ofog );
ouv = TRANSFORM_TEX(vtexcoord,_MainTex);
// calculate object space reflection vector
float3 viewDir = ObjSpaceViewDir( vvertex );
float3 I = reflect( -viewDir, vnormal );
// transform to world space reflection vector
oI = mul( (float3x3)_Object2World, I );
return o;
}
uniform sampler2D _MainTex;
uniform samplerCUBE _Cube;
uniform float4 _ReflectColor;
half4 frag (v2f i) : COLOR
{
half4 texcol = tex2D (_MainTex, iuv);
half4 reflcol = texCUBE( _Cube, iI );
reflcol = texcola;
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) = (05, 05, 05, 1)
_Shininess ("Shininess", Range (001, 1)) = 0078125
_ReflectColor ("Reflect Strength", Color) = (1,1,1,05)
_MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
_Parallax ("Height", Range (0005, 008)) = 002
_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 "UnityCGcginc"
struct v2f {
V2F_POS_FOG;
float2 uv : TEXCOORD0;
float3 I : TEXCOORD1;
};
uniform float4 _MainTex_ST;
v2f vert(appdata_tan v)
{
v2f o;
PositionFog( vvertex, opos, ofog );
ouv = TRANSFORM_TEX(vtexcoord,_MainTex);
// calculate object space reflection vector
float3 viewDir = ObjSpaceViewDir( vvertex );
float3 I = reflect( -viewDir, vnormal );
// transform to world space reflection vector
oI = mul( (float3x3)_Object2World, I );
return o;
}
uniform sampler2D _MainTex;
uniform samplerCUBE _Cube;
uniform float4 _ReflectColor;
half4 frag (v2f i) : COLOR
{
half4 texcol = tex2D (_MainTex, iuv);
half4 reflcol = texCUBE( _Cube, iI );
reflcol = texcola;
return reflcol _ReflectColor;
}
ENDCG
}
UsePass "Parallax Specular/PPL"
}
FallBack "Reflective/VertexLit", 1
}
车身shader用Reflective/Specular中的一种
然后加入以下脚本:
RenderToCubemapjs:
// 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 = TimeframeCount % 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);
gohideFlags = HideFlagsHideAndDontSave;
gotransformposition = transformposition;
gotransformrotation = Quaternionidentity;
cam = gocamera;
camfarClipPlane = 100; // don't render very far into cubemap
camenabled = false;
}
if (!rtex)
{
rtex = new RenderTexture (cubemapSize, cubemapSize, 16);
rtexisPowerOfTwo = true;
rtexisCubemap = true;
rtexhideFlags = HideFlagsHideAndDontSave;
renderersharedMaterialSetTexture ("_Cube", rtex);
}
camtransformposition = transformposition;
camRenderToCubemap (rtex, faceMask);
}
有兴趣的im可以百jjop度搜:编,程,回,忆,录,之unity3d,都是从零基础开始讲解的
function OnDisable ()
{
DestroyImmediate (cam);
DestroyImmediate (rtex);
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)