我正在尝试更新一个也被VAO引用的VBO。
第一次写入VBO时,数据似乎被接受并正确呈现。 (这是一个抽象的例子,我的VBO是如何被引入的)
GeometryBuilder.BeginSetup(allocatedIndices, BufferUsageHint.StaticDraw, 4);
GeometryBuilder.BeginBuffer(allocatedData, BufferUsageHint.StreamDraw);
GeometryBuilder.BindBufferToAttribute(0, 3, VertexAttribPointerType.Float, false, 48, 0);
GeometryBuilder.BindBufferToAttribute(1, 2, VertexAttribPointerType.Float, false, 48, 12);
GeometryBuilder.BindBufferToAttribute(2, 4, VertexAttribPointerType.Float, false, 48, 20);
GeometryBuilder.BindBufferToAttribute(3, 3, VertexAttribPointerType.Float, false, 48, 36);
GeometryBuilder.EndBuffer();
geometry = GLEXGeometryBuilder.EndSetup();
在GeometryBuilder.BeginBuffer方法中,数据是使用BufferData分配的,之后是使用BufferSubData编写的。
正如我所说。它从" assignedData "呈现数据。正确。 但这是一个动态网格,所以我想用这个来更新VBO:
GL.BindBuffer(BufferTarget.ArrayBuffer, ID);
// Uncommenting this will make my mesh flicker
//GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(length * sizeof(float)), IntPtr.Zero, BufferUsageHint.DynamicDraw);
GL.BufferSubData(BufferTarget.ArrayBuffer, (IntPtr)offset, (IntPtr)(length * sizeof(float)), data);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
但这甚至不会从" assignedData "中删除原始数据。它仍然没有发生任何事情。(除非我从GL.BufferData删除注释,然后它渲染初始" assignedData "一帧,但在下一帧它已经不见了,等等...) 渲染代码只是绑定VAO并调用DrawArrays。它也适用于所有其他网格。 我还没有在互联网上找到任何解决方案。
这可能是驱动程序错误吗? (在这台PC上有英特尔高清显卡) 或者我会错过其他的东西......
我解决了这个问题。 这是由于上传太少的顶点实际覆盖当前网格造成的。
\ O_O /