【问题标题】:Why does my Vertex Animation shader produce different results in Scene and Game view?为什么我的顶点动画着色器在场景和游戏视图中产生不同的结果?
【发布时间】:2017-03-15 20:50:54
【问题描述】:

我最近一直在制作游戏,现在我编写了一个简单的顶点动画着色器,它根据一些值置换我拥有的一些植被上的顶点。

到目前为止,一切正常,但在与 Scene & Game 并排查看游戏时遇到了一些问题。由于某种原因,它们会产生不同的结果,我无法弄清楚。游戏和场景相机都设置为等距。

这是它现在的样子: GIF Link

在右侧(场景),您可以看到植被的外观。

这是相关的代码位:

// Distance from vertex to model origin.
fixed localDistance = distance(v.vertex.xyz, fixed3(0,0,0));

// Some displacement values.
fixed s = sin(_Time.y * _WindY + v.vertex.x);
fixed c = cos(_Time.y * _WindY + v.vertex.z);

// Add the values to the Y of the vertex.
v.vertex.y += _Shakiness * s * c * localDistance * 0.2;
o.vertex = UnityObjectToClipPos(v.vertex);

(Then we pass the vertex on to the fragment, and so on...)

【问题讨论】:

  • 我愿意提供帮助,但如果没有示例项目就无法轻松复制。能否提供一个mvce 项目作为 zip 文件?
  • 是的,我会在几个小时后回家的时候把它整理好 :)
  • 我还在等。 ;)
  • 抱歉耽搁了@zwcloud,这里是:link 它应该包含你需要的一切。请记住将 Scene 和 Game 视图设置在彼此旁边以了解我的意思,因为我认为 Unity 编辑器不会将我的配置保存到项目中。

标签: c# unity3d shader


【解决方案1】:

您的模型在游戏视图中是dynamically batched。但在场景视图中,它不会发生。

动态批处理:对于足够小的网格,这会在 CPU 上转换它们的顶点,将许多相似的顶点组合在一起,然后一次性绘制它们。 因为它通过将所有 GameObject 顶点转换到 CPU 上的世界空间来工作,所以只有当这项工作比绘制调用小时它才是一个优势。

您可以将DisableBatching 添加到您的 SubShader 以禁用动态批处理。

使用 Draw Call Batching 时,一些着色器(主要是那些进行对象空间顶点变形的着色器)不起作用 - 这是因为批处理将所有几何体转换到世界空间,因此“对象空间”丢失.

DisableBatching 标记可用于指示这一点。有三个可能的值:“True”(始终禁用此着色器的批处理)、“False”(不禁用批处理;这是默认设置)和“LODFading”(当 LOD 淡化处于活动状态时禁用批处理;主要用于树)。

【讨论】:

  • 非常感谢@zwcloud,这是正确答案!我最终添加了您在我的 SubShader 标签中描述的行:"DisableBatching" = "True"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 2016-01-20
相关资源
最近更新 更多