Unity如何实现浙江玻璃栈道在哪里效果

Unity3d如何制作可在墙上移动的门和窗,门和窗比墙窄,不能被墙重叠覆盖,窗户玻璃是透明的
Unity3d如何制作可在墙上移动的门和窗
墙上移动会做,但是如果墙和窗户比墙窄就会被墙体覆盖。
如图,窗户如果比墙厚,窗户还是会挡住,使窗户不透明
那位大神能帮帮忙,非常感谢!
要评论请先&或者&
有难度,我也没有好办法。
什么叫在墙上移动? 你是说日本式的拉门?
贴片或是叫作贴花、瓷贴使用z bias。
:什么叫在墙上移动? 你是说日本式的拉门? 用鼠标拖动门,门可以调整到墙上的任意合理位置,关键有个问题是门会和墙重叠在一起,如果你这时打开门,发现有墙会挡着
看来楼主是打算动态生成、墙体的模型了
:看来楼主是打算动态生成、墙体的模型了 是的
你要实现这个的话,墙体就不能用整体的了。窗户和门所在的墙可以自己想办法生成替换掉原来的吧?或者能不能定位,把对应位置的墙体变成透明的呢?
:你要实现这个的话,墙体就不能用整体的了。窗户和门所在的墙可以自己想办法生成替换掉原来的吧?或者能不能定位,把对应位置的墙体变成透明的呢? 你说的我都想过,试过不行,不过我已经解决了,谢谢
:你说的我都想过,试过不行,不过我已经解决了,谢谢 解决了 说说方案unity实现玻璃效果
一、使用Cubemap,做一个假反射shader代码如下:Shader "Custom/glassShader" {
Properties {
_MainColor("Main Color",Color)=(1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_Cube("Cube",CUBE)=""{}
SubShader {
Tags {"RenderType"="Opaque"}
//cull off
#pragma surface surf Lambert alpha
fixed4 _MainC
sampler2D _MainT
samplerCUBE _C
struct Input {
float2 uv_MainT
float3 worldR
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb*_MainColor.
o.Emission=texCUBE(_Cube,IN.worldRefl).
o.Alpha = c.a*_MainColor.a;
FallBack "Diffuse"
二、使用GrabPass,抓取屏幕纹理,实现实时反射shader代码如下:Shader "Unlit/GrabGlass"
Properties
_Color("Main Color",Color)=(1,1,1,1)
_MainTex ("Texture", 2D) = "white" {}
Tags {"Queue"="Transparent" "RenderType"="Opaque" }//Opaque
//绘制半透明物体 关闭深度缓存
ZWrite Off
//透明混合
Blend SrcAlpha OneMinusSrcAlpha
//如果没有命名,则可以用_GrabTexture来读取,不过开销很大,应用到特殊效果时才去应用
"_GrabTex"
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
struct v2f
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
sampler2D _MainT
float4 _MainTex_ST;
sampler2D _GrabT
v2f vert (appdata v)
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
fixed4 frag (v2f i) : SV_Target
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv)*_C
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
//调整一下uv
float2 uv=i.
uv.x=1-uv.x;
return col*tex2D(_GrabTex,uv);
效果如下:三、使用摄像机实现实时反射因为GrabPass,相对来说消耗较大,只建议用于一些特殊效果,于是这里就借助辅助摄像机,来实现实时反射效果,当然这需要多写一个脚本,同时需要在辅助摄像机中屏蔽玻璃本身shader代码如下:Shader "Unlit/CameraGlass"
Properties
_MainTex ("Texture", 2D) = "white" {}
Tags { "RenderType"="Opaque" }
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
struct v2f
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
sampler2D _MainT
float4 _MainTex_ST;
v2f vert (appdata v)
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
fixed4 frag (v2f i) : SV_Target
// sample the texture
需要调整一下uv
fixed4 col = tex2D(_MainTex, 1-i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
脚本代码如下:using UnityE
using System.C
public class RenderGlassTexture : MonoBehaviour {
/// &summary&
/// 辅助摄像机
/// 原理:就是将辅助摄像机所看到的内容渲染到玻璃物体上,所以就实现了实时反射的镜面效果
/// 因为玻璃也是场景中的物体,所以辅助摄像机也会看见他
/// 所以最好能将玻璃物体单独放在一个层级中,让辅助摄像机不去渲染他
/// &/summary&
private RenderTexture renderT
/// &summary&
/// 玻璃shader
/// &/summary&
public Shader glassS
/// &summary&
/// 玻璃材质
/// &/summary&
private Material m_GlassM
protected Material GlassMaterial
if (m_GlassMaterial == null)
m_GlassMaterial = new Material(glassShader);
return m_GlassM
// Use this for initialization
void Start () {
renderTex = new RenderTexture(Screen.width, Screen.height, 16);
cam.targetTexture = renderT
//在摄像机开始裁剪场景之前调用
void OnPreCull()
GlassMaterial.SetTexture("_MainTex", renderTex);
//在相机完成场景渲染后调用
void OnPostRender()
GlassMaterial.SetTexture("_MainTex", null);
没有更多推荐了,unity除了写代码还有别方法能做出玻璃效果嘛_百度知道
unity除了写代码还有别方法能做出玻璃效果嘛
就是我把3D模型导入到unity之后 模型是个玻璃瓶 想做出那种透明效果 除了写代码还有别方法么 不会写代码 不知道怎么写啊
我有更好的答案
用插件(shaderforge)或者网上找现成的
采纳率:63%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。unity实现玻璃效果
一、使用Cubemap,做一个假反射shader代码如下:Shader "Custom/glassShader" {
Properties {
_MainColor("Main Color",Color)=(1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_Cube("Cube",CUBE)=""{}
SubShader {
Tags {"RenderType"="Opaque"}
//cull off
#pragma surface surf Lambert alpha
fixed4 _MainC
sampler2D _MainT
samplerCUBE _C
struct Input {
float2 uv_MainT
float3 worldR
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb*_MainColor.
o.Emission=texCUBE(_Cube,IN.worldRefl).
o.Alpha = c.a*_MainColor.a;
FallBack "Diffuse"
二、使用GrabPass,抓取屏幕纹理,实现实时反射shader代码如下:Shader "Unlit/GrabGlass"
Properties
_Color("Main Color",Color)=(1,1,1,1)
_MainTex ("Texture", 2D) = "white" {}
Tags {"Queue"="Transparent" "RenderType"="Opaque" }//Opaque
//绘制半透明物体 关闭深度缓存
ZWrite Off
//透明混合
Blend SrcAlpha OneMinusSrcAlpha
//如果没有命名,则可以用_GrabTexture来读取,不过开销很大,应用到特殊效果时才去应用
"_GrabTex"
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
struct v2f
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
sampler2D _MainT
float4 _MainTex_ST;
sampler2D _GrabT
v2f vert (appdata v)
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
fixed4 frag (v2f i) : SV_Target
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv)*_C
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
//调整一下uv
float2 uv=i.
uv.x=1-uv.x;
return col*tex2D(_GrabTex,uv);
效果如下:三、使用摄像机实现实时反射因为GrabPass,相对来说消耗较大,只建议用于一些特殊效果,于是这里就借助辅助摄像机,来实现实时反射效果,当然这需要多写一个脚本,同时需要在辅助摄像机中屏蔽玻璃本身shader代码如下:Shader "Unlit/CameraGlass"
Properties
_MainTex ("Texture", 2D) = "white" {}
Tags { "RenderType"="Opaque" }
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
struct v2f
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
sampler2D _MainT
float4 _MainTex_ST;
v2f vert (appdata v)
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
fixed4 frag (v2f i) : SV_Target
// sample the texture
需要调整一下uv
fixed4 col = tex2D(_MainTex, 1-i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
脚本代码如下:using UnityE
using System.C
public class RenderGlassTexture : MonoBehaviour {
/// &summary&
/// 辅助摄像机
/// 原理:就是将辅助摄像机所看到的内容渲染到玻璃物体上,所以就实现了实时反射的镜面效果
/// 因为玻璃也是场景中的物体,所以辅助摄像机也会看见他
/// 所以最好能将玻璃物体单独放在一个层级中,让辅助摄像机不去渲染他
/// &/summary&
private RenderTexture renderT
/// &summary&
/// 玻璃shader
/// &/summary&
public Shader glassS
/// &summary&
/// 玻璃材质
/// &/summary&
private Material m_GlassM
protected Material GlassMaterial
if (m_GlassMaterial == null)
m_GlassMaterial = new Material(glassShader);
return m_GlassM
// Use this for initialization
void Start () {
renderTex = new RenderTexture(Screen.width, Screen.height, 16);
cam.targetTexture = renderT
//在摄像机开始裁剪场景之前调用
void OnPreCull()
GlassMaterial.SetTexture("_MainTex", renderTex);
//在相机完成场景渲染后调用
void OnPostRender()
GlassMaterial.SetTexture("_MainTex", null);
没有更多推荐了,10913 条评论分享收藏感谢收起赞同 93 条评论分享收藏感谢收起写回答}

我要回帖

更多关于 隔音玻璃效果好吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信