我可以为每个调用调用具有不同数组的着色器,还是应该创建多个着色器?

时间:2014-03-24 18:48:55

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

  • 如果您使用制服,则可以为绘制调用中的所有行设置短划线模式,但不能为其中的单个行设置。

  • 如果使用属性,则必须复制行中每个顶点的虚线模式选择。这与例如通常的处理方法没有什么不同。彩色线条,你必须在每个顶点给出(相同)颜色。

    如果您关注的是总数据大小,则可以执行间接操作,例如在统一数组或纹理中存储多个虚线模式,然后使用属性查找所需模式。这将允许您使用一个数字而不是每个顶点四个。