unity3d - 可以为表面着色器应用数据输入设置顶点 alpha 吗?
问题描述
我的着色器做了一些数学运算来确定顶点 alpha,所以我有一个函数可以在数据传递到我的 surf 函数之前执行此操作。
#pragma surface surf Standard alpha
#pragma target 3.0
struct Input
{
float2 uv_MainTex;
float tranparency;
};
void foo(inout appdata_full v, out Input o) {
UNITY_INITIALIZE_OUTPUT(Input, o);
float someAlpha;
[...some maths to create someAlpha value...]
v.color.a = someAlpha;
o.transparency = v.color.a;
}
half _Glossiness;
half _Metallic;
fixed4 _Color;
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_INSTANCING_BUFFER_END(Props)
void surf (Input IN, inout SurfaceOutputStandard o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
然后,当我使用 Input IN 时,我希望在设置 alpha 时反映 someAlpha:
o.Alpha = c.a; //Can I do c.a * IN.transparency ?
目前,绝对没有任何反应。如何在 surf 中使用我想要的 alpha 值?
解决方案
是的。您可以COLOR
向对象添加语义Input
:
struct Input {
float4 uv_MainTex;
float4 color : COLOR;
};
然后分配给它foo
(尽管如果你有这可能不是必需的#pragma surface surf
):
void foo(inout appdata_full v, out Input o) {
UNITY_INITIALIZE_OUTPUT(Input, o);
float someAlpha;
[...some maths to create someAlpha value...]
v.color.a = someAlpha;
o.color = v.color;
}
然后使用它surf
:
void surf (Input IN, inout SurfaceOutputStandard o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
fixed4 vertexColor = IN.color;
o.Albedo = c.rgb;
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = vertexColor.a * c.a;
}
最后,通过更改为:告诉 Unityfoo
在表面着色器之前用作顶点着色器:#pragma surface surf Standard alpha
#pragma surface surf Standard alpha vertex:foo
推荐阅读
- python - Python 请求控制响应
- datetime - Power BI DAX:从 SELECTEDVALUE 日期时间中减去一小时
- java - 在 R 上使用 Java 16 运行 H2O
- sql-server - 将已删除的行重新插入到同一个表 SQL Server 2005
- dart - 有没有办法使用 mixin 在类中访问 mixin 的私有变量?
- java - Graphstream(Android) - 无法在片段中显示图形
- sql - n:m 表连接两个表或一个包含“逗号”分隔值的字段
- docker - Docker 启动 2 个容器的特定顺序
- dictionary - 遍历 TestComplete 中的字典
- c - C中条件的最小值和最大值问题