向统一着色器添加透明度处理(alpha 集响应)
Add transparency handling (alpha set response) to unity shader
我有一个不响应 alpha 变化的线条渲染器的着色器。查看有意义的代码。
我不能使用默认的 material 和 alpha 处理,因为线渲染器没有正确绘制它(它表现为广告牌并且未正确渲染)。所以我想将 alpha 处理合并到我的着色器中。
着色器最终 returns 行中的颜色:
finalColor = _Color;
但我不知道如何传入 alpha,以便在统一使用此着色器时可以在编辑器中或代码中处理透明度 material。
在下面找到着色器代码:
Shader "CustomShaders/UnlitColorAbove"
{
Properties
{
_Color("Color", Color) = (0,0,0,0)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
CGINCLUDE
#pragma target 3.0
ENDCG
Blend Off
Cull Back
ColorMask RGBA
ZWrite On
ZTest Always
Pass
{
Name "Unlit"
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
uniform float4 _Color;
v2f vert ( appdata v )
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
UNITY_TRANSFER_INSTANCE_ID(v, o);
float4 vertexValue = float3(0,0,0,0) ;
#if ASE_ABSOLUTE_VERTEX_POS
v.vertex.xyzw = vertexValue;
#else
v.vertex.xyzw += vertexValue;
#endif
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i ) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(i);
fixed4 finalColor;
finalColor = _Color;
return finalColor;
}
ENDCG
}
}
CustomEditor "ASEMaterialInspector"
}
还有一些我尝试将 alpha 处理合并到着色器中的东西:
https://answers.unity.com/questions/676989/how-can-i-add-transparency-to-this.html
https://forum.unity.com/threads/how-add-support-to-alpha-on-this-shader.494460/
但是没有成功,因为我不熟悉shader编程,shader不工作或者编译不上
您提供的 * 显示了您的着色器实际上缺少什么来支持 alpha 透明度。
您需要将 alpha 混合添加到您的着色器中,而不是:
Blend Off
应该是,例如**:
Blend SrcAlpha OneMinusSrcAlpha
大致就是这样***
我还注意到您正在使用 Amplify Shader Editor(因为您的代码底部有注释 CustomEditor "ASEMaterialInspector"
)
您要找的设置在这里:
.* 您链接的前两个线程讨论了向表面着色器添加 alpha 透明度,而您提供的着色器是顶点片段着色器。
.** 有关混合类型的更多信息 see unity docs). Also I could recommend this cool talk about VFX in Diablo,其中显示了选择适当的混合对着色器的重要性。
.*** 你在行 float4 vertexValue = float3(0,0,0,0) ;
中有一个错字,它应该是 float4(0,0,0,0)
,你也应该考虑将 Tags { "RenderType"="Opaque" }
更改为 Tags { "Queue"="Transparent" }
你可以阅读更多关于 SubShader 标签 here
我有一个不响应 alpha 变化的线条渲染器的着色器。查看有意义的代码。 我不能使用默认的 material 和 alpha 处理,因为线渲染器没有正确绘制它(它表现为广告牌并且未正确渲染)。所以我想将 alpha 处理合并到我的着色器中。
着色器最终 returns 行中的颜色:
finalColor = _Color;
但我不知道如何传入 alpha,以便在统一使用此着色器时可以在编辑器中或代码中处理透明度 material。
在下面找到着色器代码:
Shader "CustomShaders/UnlitColorAbove"
{
Properties
{
_Color("Color", Color) = (0,0,0,0)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
CGINCLUDE
#pragma target 3.0
ENDCG
Blend Off
Cull Back
ColorMask RGBA
ZWrite On
ZTest Always
Pass
{
Name "Unlit"
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
uniform float4 _Color;
v2f vert ( appdata v )
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
UNITY_TRANSFER_INSTANCE_ID(v, o);
float4 vertexValue = float3(0,0,0,0) ;
#if ASE_ABSOLUTE_VERTEX_POS
v.vertex.xyzw = vertexValue;
#else
v.vertex.xyzw += vertexValue;
#endif
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i ) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(i);
fixed4 finalColor;
finalColor = _Color;
return finalColor;
}
ENDCG
}
}
CustomEditor "ASEMaterialInspector"
}
还有一些我尝试将 alpha 处理合并到着色器中的东西:
https://answers.unity.com/questions/676989/how-can-i-add-transparency-to-this.html
https://forum.unity.com/threads/how-add-support-to-alpha-on-this-shader.494460/
但是没有成功,因为我不熟悉shader编程,shader不工作或者编译不上
您提供的
您需要将 alpha 混合添加到您的着色器中,而不是:
Blend Off
应该是,例如**:
Blend SrcAlpha OneMinusSrcAlpha
大致就是这样***
我还注意到您正在使用 Amplify Shader Editor(因为您的代码底部有注释 CustomEditor "ASEMaterialInspector"
)
您要找的设置在这里:
.* 您链接的前两个线程讨论了向表面着色器添加 alpha 透明度,而您提供的着色器是顶点片段着色器。
.** 有关混合类型的更多信息 see unity docs). Also I could recommend this cool talk about VFX in Diablo,其中显示了选择适当的混合对着色器的重要性。
.*** 你在行 float4 vertexValue = float3(0,0,0,0) ;
中有一个错字,它应该是 float4(0,0,0,0)
,你也应该考虑将 Tags { "RenderType"="Opaque" }
更改为 Tags { "Queue"="Transparent" }
你可以阅读更多关于 SubShader 标签 here