如何使投影机只影响物体的某些特定部分?

时间:2017-09-11 08:22:09

标签: c# unity3d shader effects projector

我正在使用Unity3D进行鱼类射击游戏。我正在为鱼类实施水下腐蚀作用。我在Unity的StandardAsset中使用“BlobLightProjector”,附带脚本,每帧都改变纹理:

public Texture2D[] frames;
private int frameIndex;
private Projector projector;
...
// repeat every frame
projector.material.SetTexture("_ShadowTex", frames[frameIndex]);
frameIndex = (frameIndex + 1) % frames.Length;

我的列表焦散纹理如下所示:

List caustic texture

这是我取得的成就: My achieve

现在问题是我希望投影机只影响鱼的上部(即使我将鱼旋转到任何方向),这看起来像这样: My wish

你能给我一些建议怎么做,或者其他解决方案不使用投影机是好的。

2 个答案:

答案 0 :(得分:0)

在我看来,你需要使用自定义着色器。我会说实话,我不是他们的专家,但有一个关于着色器的Unite 2016,其中有一个非常类似的例子。

对不起,我没有任何代码,但我希望这至少会朝着正确的方向迈出一小步

答案 1 :(得分:0)

您需要通过以下方式修改资产\标准资产\效果\投影机\ Shaders \ ProjectorLight.shader

  1. 您需要创建一个新变量,该变量将从顶点着色器传递到if(PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 结构中的像素着色器:v2f
  2. 然后你需要能够在顶点着色器中使用法线。一个简单的选择是使用half fade : TEXCOORD3;而不是仅传递顶点位置:appdata_base并通过将v2f vert (appdata_base v)附加到v.来修改对该位置的调用。
  3. 然后根据法线计算衰落因子:我选择仅钳制世界法线的垂直轴(因为它的范围从-1到1)vertexo.fade = saturate(mul(unity_ObjectToWorld, v.normal).y);钳位到0-1,矩阵saturate()转换为世界空间。
  4. 最后将渐变应用于像素着色器mul()中的结果(我将范围增加8,因为否则值永远不会比1亮,但这取决于您的喜好)

    texS.rgb *= _Color.rgb * 8.0 * i.fade;