gpt4 book ai didi

unity3d - 为片段着色器 (GLSL) 添加 alpha 支持

转载 作者:行者123 更新时间:2023-12-03 21:45:40 25 4
gpt4 key购买 nike

我从 here 得到了代码.随着时间的推移,这个着色器在 2 个纹理中循环,具有“删除”效果(请参阅演示源代码)。现在我已经学习并理解了其中的大部分内容,我正在尝试将其更改为能够使用带有 alpha 的纹理。

这是着色器代码:

Shader "Wipe" {

Properties{
_tex0 ("Texture1", 2D) = "white" {}
_tex1 ("Texture2", 2D) = "white" {}
}

SubShader{
Tags {"Queue"="Geometry"}

Pass{
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

sampler2D _tex0;
sampler2D _tex1;
float4 _tex0_ST;

struct v2f {
float4 pos : POSITION;
float4 color : COLOR0;
float4 fragPos : COLOR1;
float2 uv : TEXCOORD0;
};

v2f vert (appdata_base v){
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.fragPos = o.pos;
o.uv = TRANSFORM_TEX (v.texcoord, _tex0);
o.color = float4 (1.0, 1.0, 1.0, 1);
return o;
}

half4 frag (v2f i) : COLOR{
float animtime = _Time*10.0;
float2 q = i.uv.xy / float2(1,1);
float3 oricol = tex2D (_tex0,float2(q.x,q.y)).xyz;
float3 col = tex2D (_tex1,float2(i.uv.x,i.uv.y)).xyz;
float comp = smoothstep( 0.2, 0.7, sin(animtime) );
col = lerp(col,oricol, clamp(-2.0+2.0*q.x+3.0*comp,0.0,1.0));

// custom alpha bit
float4 textureColor = float4(col,1);
if(textureColor.a < 1.0){
discard;
}

return textureColor;
}
ENDCG
}
}
//FallBack "VertexLit"
}

我试图在最后一个函数中实现一个小代码片段来支持 alpha。我尝试将标签更改为 {"Queue"="Transparent""IgnoreProjector"="True""RenderType"="Transparent"},将 Cull 和 ZWrite 设置为 Off,添加 Blend SrcAlpha OneMinusSrcAlpha ......基本上尝试丢弃透明片段,alpha测试和混合,但我一定是做错了什么。

我将我的两个纹理(PSD,带有 Alpha 的 Photoshop 文件格式)设置为“高级”纹理类型,关闭“生成 Mip 贴图”,打开“Alpha 是透明度”,并将“格式”设置为“RGBA 32 位” .使用这些设置和上面的着色器,我的纹理可以正常预览,但我的纹理平面是黑色的......

任何人都可以帮助我或向我建议正确的方向?

编辑 :
(抱歉链接,我还没有足够的声誉来发布它们)

这是我使用未经编辑的着色器从 here 得到的结果+ PSD 设置为正常(无高级纹理设置):
http://answers.unity3d.com/storage/temp/22441-unity_base.jpg

这是我使用当前着色器(上面的代码)+ PSD 作为纹理得到的结果,设置为 RGBA 32 位,没有 Mip 贴图,并且“Alpha 是透明度”打开:
http://answers.unity3d.com/storage/temp/22442-unity_black.jpg

这就是我想要实现的(但不是使用静止图像,我想保留原始的“删除”效果):
http://nicolasraspail.com/unity_achieve.png

编辑: 这是正常工作的着色器 (感谢@nwellnhof!)
    Shader "Wipe" {

// Editor controllers
Properties{
_tex0 ("Texture1", 2D) = "white" {}
_tex1 ("Texture2", 2D) = "white" {}
}

SubShader{
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha

Pass{
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

sampler2D _tex0;
sampler2D _tex1;
float4 _tex0_ST;

struct v2f {
float4 pos : POSITION;
float4 color : COLOR0;
float4 fragPos : COLOR1;
float2 uv : TEXCOORD0;
};

v2f vert (appdata_base v){
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.fragPos = o.pos;
o.uv = TRANSFORM_TEX (v.texcoord, _tex0);
o.color = float4 (1.0, 1.0, 1.0, 1);
return o;
}

half4 frag (v2f i) : COLOR{
float4 oricol = tex2D(_tex0, i.uv);
float4 col = tex2D(_tex1, i.uv);
float animtime = _Time * 10.0;
float comp = smoothstep(0.2, 0.7, sin(animtime));
float coeff = clamp(-2.0 + 2.0 * i.uv.x + 3.0 * comp, 0.0, 1.0);
float4 result = lerp(col, oricol, coeff);

return result;
}
ENDCG
}
}
//FallBack "VertexLit"
}

最佳答案

好吧,如果 _tex1 中的颜色,您对片段程序的更改会丢弃整个片段。是透明的。那不会有想要的效果。您应该做的是取消您的更改并简单地使用 float4而不是 float3对于颜色变量并删除 .xyz在任务结束时。那是:

    float4 oricol = tex2D (_tex0,float2(q.x,q.y));
float4 col = tex2D (_tex1,float2(i.uv.x,i.uv.y));

但是整个程序可以简化很多。类似下面的内容应该是等效的(未经测试):
half4 frag (v2f i) : COLOR {
float4 oricol = tex2D(_tex0, i.uv);
float4 col = tex2D(_tex1, i.uv);
float animtime = _Time * 10.0;
float comp = smoothstep(0.2, 0.7, sin(animtime));
float coeff = clamp(-2.0 + 2.0 * i.uv.x + 3.0 * comp, 0.0, 1.0);
float4 result = lerp(col, oricol, coeff);

return result;
}

关于unity3d - 为片段着色器 (GLSL) 添加 alpha 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21967969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com