【问题标题】:Can I call a shader with a different array for each call or should I make multiple shaders?我可以为每个调用调用具有不同数组的着色器还是应该制作多个着色器?
【发布时间】:2014-03-25 07:53:37
【问题描述】:

我正在尝试确定使用 Three.js (webgl) 中的着色器处理自定义虚线的最佳方式。这些虚线可能有不同的模式。我希望我能够编写一个可以处理任何类型的破折号模式的着色器。该模式将由一组值(例如[0.125, -0.125, 0.250, -0.250])给出,其中负值是空格的长度,正值是破折号的长度。

我是着色器新手,我不确定上述是否可行。如果我理解正确,统一数组将不合适,因为我希望该数组根据在特定线实体上绘制的模式进行更改。但我认为属性数组不合适,因为这似乎是与顶点相关联的值数组。那么我想做的事情是否可行,或者我必须为每个模式动态制作着色器?

到目前为止,我是否正确理解了这一点?有什么建议么?这是我第一次(希望也是唯一一次)需要使用着色器。

【问题讨论】:

  • 看看这是否有帮助:threejs.org/examples/webgl_lines_dashed.html。并在ShaderLib.js 中搜索“虚线”。
  • 是的,我已经调查过了。它是一个非常基本的着色器,只有一个 gapSize 和 dashSize,它不符合我的任何要求。不过谢谢
  • 你的项目听起来很有趣。如果您愿意分享您的结果,那就太好了!但要小心,着色器会在你身上生长。 :-)

标签: three.js glsl webgl shader fragment-shader


【解决方案1】:

你必须使用制服或属性;在 WebGL 中,两者之间没有任何“中间”,其他可能的实现最终将取决于统一或属性(或常量)数据。

  • 如果您使用制服,您可以为绘图调用中的所有线条设置虚线图案,但不能为其中的个别线条设置虚线图案。

  • 如果使用属性,则必须为线中的每个顶点复制虚线图案的选择。这与通常的处理方式没有什么不同,例如彩色线条,您必须在每个顶点处赋予(相同的)颜色。

    如果您关心的是总数据大小,您可以进行间接处理,例如将多个短划线图案存储在统一数组或纹理中,然后使用属性查找所需的图案。这将允许您使用一个数字而不是每个顶点的四个。

【讨论】:

  • 感谢您确认我的怀疑和建议。我可能会按照统一数组或纹理中的所有数据的路径,并使用属性来查找所需的模式。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2019-05-14
  • 1970-01-01
相关资源
最近更新 更多