我的模型渲染了数千个顶点和不同的颜色。它们都存储在顶点缓冲区对象中并从顶层缓冲区对象渲染。
是否有可能以任何方式更改特定的顶点颜色而无需使用几种不同的颜色重建整个顶点缓冲区对象?
答案 0 :(得分:1)
是的,你可以。假设您确实将数据存储在VBO中,您可以通过首先绑定所述对象然后使用glBufferSubData来更新它的选择块。看看这里。 https://www.opengl.org/sdk/docs/man3/xhtml/glBufferSubData.xml
答案 1 :(得分:0)
我理解您的用例的方式,您只使用分配给大量顶点的相对少量的不同颜色。并且您希望能够在不修改整个VBO的情况下轻松更新这些颜色。
您可以使用某种形式的间接颜色。例如:
使用编码“颜色索引”的顶点属性,该属性可以是单个标量值。这存储在每个顶点的VBO中。
将实际颜色存储在纹理中。 ES 2.0没有1D纹理,但您可以使用2D纹理,其中宽度是所需颜色的数量,高度为1.您可以将此纹理解释为颜色贴图。
在顶点着色器中,使用“颜色索引”顶点属性作为纹理坐标对纹理进行采样。如果相应地设置顶点属性的值(介于0.0和1.0之间),则可以直接将其用作纹理坐标。
只要您想更新颜色,请使用glTexSubImage2D()
修改颜色贴图纹理。
这可能比直接在顶点缓冲区中使用颜色要慢,因为您需要为每个顶点进行纹理查找。另一方面,由于顶点数据变小,因此可以节省内存带宽。值得一试,特别是如果它能更有效地更新数据。
答案 2 :(得分:0)
您可以仅为颜色数据创建顶点缓冲区对象,并为其他所有内容使用另一个VBO。您需要修改的唯一VBO是颜色数据,应该明显更快。您只需绑定它们,确保从相应的缓冲区对象设置顶点属性。
我为顶点位置需要设置动画的模型做了类似的事情,除了在我的情况下,位置是单独存储的,"其他所有" (颜色,紫外线等)是一个静态的VBO。