我正在尝试使用unity 5 beta为WebGL构建一个统一的网站。 我编写的自定义着色器(或者更准确地从现有的着色器编辑)不再适用于Unity 5。 这是着色器应该做的事情。创建一个元球效果,其中alpha以圆形曲线斜坡上升。 Shader变成了这个.. 进入这个..(通过渲染纹理)
这是整个事情......
//Water Metaball Shader effect by Rodrigo Fernandez Diaz-2013
//Visit http://codeartist.info/ for more!!
Shader "Custom/Metaballs" {
Properties {
_MyColor ("Some Color", Color) = (1,1,1,1)
_MainTex ("Texture", 2D) = "white" { }
_botmcut ("bottom cutoff", Range(0,1)) = 0.1
_topcut ("top cutoff", Range(0,4)) = 0.8
_constant ("curvature constant", Range(0,5)) = 1
}
SubShader {
Tags {"Queue" = "Transparent" }
Pass {
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _MyColor;
float4 _Color;
sampler2D _MainTex;
float _botmcut,_topcut,_constant;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
float4 _MainTex_ST;
v2f vert (appdata_base v){
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
return o;
}
half4 frag (v2f i) : COLOR{
half4 texcol,finalColor;
texcol = tex2D (_MainTex, i.uv);
//finalColor=_Color*texcol;
finalColor=_MyColor;
if(texcol.a<_botmcut)
{
finalColor.a= 0;
}
else if((texcol.a>_topcut))
{
finalColor.a= 0;
}
else
{
float r = _topcut-_botmcut;
float xpos = _topcut - texcol.a;
finalColor.a= 1-(_botmcut + sqrt((xpos*xpos)-(r*r)))/_constant;
}
return finalColor;
}
ENDCG
}
}
Fallback "VertexLit"
}
我在Unity 5中遇到的问题是生成的纹理是空白的。即。 0 alpha。 似乎导致问题的一点就是这个。
else
{
float r = _topcut-_botmcut;
float xpos = _topcut - texcol.a;
finalColor.a= 1-(_botmcut + sqrt((xpos*xpos)-(r*r)))/_constant;
}
如果我注释掉这个“finalCOlor ... etc etc”的最后一行,那么我会看到某些东西 这是通常创建圆形alpha曲线的线,但在单位5中,它似乎总是解析为0。是否有一些API变化?因为数学应该与它在统一中的工作方式相同4。 PS。我对着色器不太了解!
答案 0 :(得分:2)
我在跟踪着色器问题时通常会做的一些事情。
选项1 尝试使用PIX或其他一些标准程序来调试着色器。您只需要捕获框架并右键单击像素并点击调试。我要密切注意每个值是什么,确保没有设置为0,这不应该是。同时在此工具中验证正在使用正确的纹理。
选项2 如果将finalColor.a设置为0.5,这会做什么吗?如果你知道这个问题是你的一个变量是0,那么_constant甚至允许0的范围吗?我认为应该诚实地从&gt; 0到5。还要确认您没有覆盖材料上的任何常量或变量,请确保它们仍然全部设置为默认值。您甚至可能只想在着色器中对它们进行硬设置以查看是否可以解决问题。
最后,解决着色器问题并不容易,但是它在Unity 4中运行并且不在5中这一事实告诉我你可能只是将某些东西解析为0,所以我先检查它。
答案 1 :(得分:0)
我不知道为什么......但是改变这一行..
finalColor.a= 1-(_botmcut + sqrt((xpos*xpos)-(r*r)))/_constant;
到此..
finalColor.a= 1-(_botmcut + sqrt((r*r)-(xpos*xpos)))/_constant;
的工作。 它没有意义!