shader - 如何允许重叠对象的边缘显示在具有相同着色器的另一个对象前面?
问题描述
这就是它目前的样子,但我希望黑色轮廓在场景中的另一个对象前面时勾勒出整个球体。重叠阴影对象.jpg
这是我的着色器编码器:
Shader "test/shader"
{
Properties
{
_Color("Color", Color) = (1,1,1,1)
_LightPosition("Light Position", Vector) = (0,0,0,0)
_OutLineColor("Outline Color", Color) = (0,0,0,1)
_OutlineThickness("Outline Thickness", Range(1,1.5)) = 1.1
}
SubShader
{
Pass //Outline
{
ZWrite Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};
struct v2f
{
float4 position : SV_POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};
fixed4 _OutLineColor;
fixed4 _OutlineThickness;
v2f vert(appdata IN)
{
v2f OUT;
OUT.normal = IN.normal;
OUT.position = UnityObjectToClipPos(IN.vertex * 1.1);
OUT.uv = IN.uv;
return OUT;
}
fixed4 frag(v2f IN) : SV_Target
{
float3 outlineColor = _OutLineColor.rgb;
return float4(outlineColor, 1);
}
ENDCG
}
Pass //Main
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};
struct v2f
{
float4 position : SV_POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};
fixed4 _Color;
float4 _LightPosition;
v2f vert(appdata IN)
{
v2f OUT;
OUT.normal = IN.normal;
OUT.position = UnityObjectToClipPos(IN.vertex);
OUT.uv = IN.uv;
return OUT;
}
fixed4 frag(v2f IN) : SV_Target
{
//Direct Light
float3 lightDir = _WorldSpaceLightPos0.xyz;
float3 color = _Color.rgb;
fixed3 lightFalloff = saturate(dot(lightDir, IN.normal));
lightFalloff = step(0.1, lightFalloff);
float3 directDiffuseLight = color * lightFalloff;
//Ambient light
float3 ambientLight = float3(0.1,0.1,0.1);
//Composite
float3 diffuseLight = ambientLight + directDiffuseLight;
float3 finalSurfaceColor = diffuseLight * color;
float1 zero = 0;
return float4(finalSurfaceColor, zero);
}
ENDCG
}
}
}
我相信问题出在第一关的开始,特别是“ZWrite Off”。但问题是,我认为这是必要的,以便放大网格出现在主网格后面,也许这就是为什么放大/轮廓网格出现在具有相同着色器的其他对象后面的原因。
有一个简单的解决方法吗?
解决方案
我为任何有同样问题的人解决了这个问题。我翻转了通道,使第二通道成为轮廓。然后我用“Cull Front”替换了“Zwrite Off”。
即使这解决了这个特定问题,也不要使用我的着色器脚本,因为它的编写方式需要具有相同高度、宽度和深度的对象。如果尺寸不同,那么轮廓厚度也会不同。
推荐阅读
- android - 带有 Javascript Google API 的 Android 上的 Web 应用程序
- python - 显示粘贴内容表单波斯语pdf的问题
- bash - 安装 oh my zsh 后 Bash 脚本提前退出
- r - 在 `DesktopDeployR` 包中更改闪亮的应用程序名称
- python - 如何在使用 mongo db 和 python 更改函数值时获取警报?
- sql - 如何在 sql-LIKE 通配符中使用非字符列表?
- c# - 想要使用 XPath 来确保 XHTML 元素有一个具有特定名称的父 a
- docker - 如何将vlan ip添加到docker容器
- linux-device-driver - 访问 ARM 外设寄存器:non-linefetch (0x1008) 时的外部中止
- java - 如何在 Appium 的 AndroidUIAutomator 脚本中添加等待