【发布时间】:2018-10-19 02:04:04
【问题描述】:
我正在尝试在 Unity 中实现门户。我这样做的方式是让摄像机模拟玩家在其他门户本地空间中的位置和旋转。 我的问题是,门户后面的任何东西都会在这个相机上渲染,所以如果我从门户移回,其他一些东西会夹进来。我制作了一个应该添加剪切平面的着色器,但它似乎是要么剪掉所有东西,要么什么都不剪:
Shader "Hidden/ClipPlaneShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_PlaneNormal("PlaneNormal",Vector) = (0,1,0,0)
_PlanePosition("PlanePosition",Vector) = (0,0.5,0,0)
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float clip : SV_ClipDistance0;
};
float4 _PlaneNormal;
float4 _PlanePosition;
v2f vert (appdata v)
{
float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
o.clip = dot(worldPos - _PlanePosition, _PlaneNormal);
return o;
}
sampler2D _MainTex;
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}
我正在通过这个脚本将它添加到相机中,但我不知道这是否是最好的方法:
private void OnRenderImage(RenderTexture src, RenderTexture dest)
{
_material.SetVector("_PlanePosition", planePosition);
_material.SetVector("_PlaneNormal", planeNormal);
Graphics.Blit(src, dest, _material);
}
谁能看出我做错了什么?
编辑: Portal 的人称这个问题为“香蕉汁”,他们在这段视频中进行了解释:https://youtu.be/ivyseNMVt-4?t=1064
我试着在这里画了一张漂亮的照片:https://imgur.com/9Dc57Pm
左边的眼睛是玩家,右边的眼睛是我的传送门。门户相机应该只渲染黄线(剪辑平面)下方的东西,但它也会渲染盒子,所以它最终看起来对玩家来说很奇怪。
EDIT^2:我想我在使用 OnRenderImage() 函数应用我的材质时发现了一个问题。那是 2D 纹理。
如何将着色器应用于场景中的所有对象?
【问题讨论】:
-
我认为使用点积可能是错误的方法,但我也不确定我是否完全理解您的问题。你有任何可以显示的屏幕截图吗?或者,也许您可以画出您的场景的自上而下的草图并解释正在发生的事情。
-
我尝试更好地描述问题并添加了图片和视频。