unity3d - 在 Unity 中使用自定义着色器遮罩 3D 对象
问题描述
我正在制作 2D 手机游戏,但我想在商店部分使用 3D 对象。所以,在商店部分,我有一个滚动矩形和一个视口。我可以滚动,并且遮罩组件可以按预期使用 2D 对象。但是当我添加 3D 对象时,对象会脱离遮罩。我研究了论坛,找到了一个自定义着色器。当我将着色器应用于对象材质时,它会部分起作用。但是深度或阴影无法正常工作。我对着色器知之甚少。你可以看看这张图片。右边的盒子是原始盒子,左边的盒子是带有自定义着色器的盒子。
我的着色器代码在这里;
Shader "Custom/NewSurfaceShader" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
_StencilComp("Stencil Comparison", Float) = 8
_Stencil("Stencil ID", Float) = 0
_StencilOp("Stencil Operation", Float) = 0
_StencilWriteMask("Stencil Write Mask", Float) = 255
_StencilReadMask("Stencil Read Mask", Float) = 255
_ColorMask("Color Mask", Float) = 15
[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip("Use Alpha Clip", Float) = 0
}
SubShader
{
Tags { "RenderType"="UI""Queue"="Transparent" }
LOD 200
ZTest[unity_GUIZTestMode]
Blend SrcAlpha OneMinusSrcAlpha
ColorMask[_ColorMask]
Stencil
{
Ref 1
Comp LEqual
Pass Keep
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
}
CGPROGRAM
#pragma surface surf Standard vertex:vert fullforwardshadows
#pragma target 3.0
#include "UnityUI.cginc"
struct Input
{
float2 uv_MainTex;
float4 worldPosition;
};
void vert(inout appdata_full v, out Input o)
{
UNITY_INITIALIZE_OUTPUT(Input, o);
o.worldPosition = v.vertex;
}
sampler2D _MainTex;
half _Glossiness;
half _Metallic;
fixed4 _Color;
float4 _ClipRect;
void surf (Input IN, inout SurfaceOutputStandard o) {
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
o.Alpha *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
#ifdef UNITY_UI_ALPHACLIP
clip(o.Alpha - 0.001);
#endif
}
ENDCG
}
FallBack "Diffuse"
}
解决方案
推荐阅读
- css - 悬停时将图像从灰色变为真正的深黑色
- objective-c - deferredCurrentActivation 致命异常
- dart - Dart & Flutter:如何等待请求结果
- c++ - 指针与继承的关系 c++ oop
- node.js - npm 总是在 ubuntu 中创建一个带有节点模块的 min 文件夹
- algorithm - 求解非线性丢番图方程,例如 (8+3n)m = 11?
- javascript - 在反应渲染中将数组转换为字符串失败-Javascript/React
- java - 什么是 CompoundCallable?
- react-native - 从抽屉导航器导航到特定选项卡
- arrays - 包含给定查询点的区间数