使用8个索引顶点时,面颜色不是唯一的



在没有任何代码的情况下,让我描述一下这个问题。

我重新创建了旋转立方体的基本课程。第4课学习Webglhttp://learningwebgl.com/lessons/lesson04/index.html

该代码为每个面列出了4个顶点,总共24个顶点。它使用这24个顶点0-23的索引来绘制元素(…),并使用具有24种不同颜色的颜色缓冲数组。

所以最终的结果当然是一个旋转的立方体,每个面都分配了不同的颜色。

我所做的是研究一个立方体实际上只有8个顶点,而不是24个。所以我做了一个8个顶点的数组。我修改了位置索引数组,使其使用0-7的索引,而不是0-23的索引。我保留了颜色缓冲区阵列,因为我对面创建的顺序与原始课程中的顺序相同。

当我完成drawElements(…)时,我确实有一个完美的旋转立方体。但是立方体的颜色不正确。每个顶点都有一种颜色,因此只使用了颜色阵列元素中的前八个(24个)。基本上,上半部分是一种颜色,下半部分是另一种颜色。立方体的面没有唯一的颜色。

问题是:有没有一种方法可以为顶点索引而不是顶点指定颜色?我怀疑我可以在着色器中使用gl_vertexID,但我想我应该先得到一些意见?

谢谢。。。

简短的回答是否定的。

基本上,您有为顶点赋值的树选项:

  1. 为每个顶点指定一个唯一值。请注意,如果要使用具有不同值的顶点(例如每个面的颜色不同),则每个"配置"都必须有一个唯一的顶点
  2. 有时可以计算顶点或片段着色器中的值(在您的情况下,这实际上会起作用)
  3. 使用统一着色器值-这将为所有顶点指定相同的值(在这种情况下,这显然不是您想要的)

有关更多信息,我建议你阅读我关于Unity中程序网格生成的博客文章,因为它解释了基本概念:

  • http://blog.nobel-joergensen.com/2010/12/25/procedural-generated-mesh-in-unity/
  • http://blog.nobel-joergensen.com/2011/04/05/procedural-generated-mesh-in-unity-part-2-with-uv-mapping/

没有简单的方法可以将每个人脸的数据传递给WebGL。

在WebGL(和OpenGL ES 2)中,有两种数据可以传递给着色器:顶点属性和统一。每个顶点的顶点属性可以有不同的值,而统一数据只有一个值,该值只能通过uniform*()调用之一显式更改。

当顶点属性(例如颜色)直接从顶点着色器传递到片段着色器时,硬件会自动对其进行插值,从而使值(颜色)在生成的三角形表面上平滑变化。因此,要给三角形一个"平坦"的颜色,三角形的所有顶点都需要有相同的颜色。由于顶点也将是可能具有不同颜色的其他三角形的一部分,因此唯一的选择是为使用同一点的每个面的每个不同颜色创建一个单独的顶点条目。

如果要使用制服,则必须在绘制每个面时更改制服。这意味着您必须将多维数据集分为6个部分,并进行6次单独的绘图调用。这样做的效率要低得多。众所周知,"不那么邪恶"的解决方案是如所述有多个顶点条目,并占用一些额外的GPU内存,以加快绘制速度。

在OpenGL的其他版本中,有一个函数glVertexAttribDivisor()可以让您设置一个顶点属性,该属性只更改每n个顶点。这可以用来实现你想要做的事情。但不幸的是,它在WebGL中不可用。

最新更新