我正在WebGL中开发布料模拟器,已经准备好所有物理和动画,但是我无法渲染。我习惯在Opengl中使用glVertex,因此在每次迭代中我都可以更改顶点的位置,并且它会移动,但是在WebGL(OpenGL ES)中没有这种方法。

这是我的代码:

//Initialization:
    puntosBuffer= gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, puntosBuffer);
    telaVertices3=new Array(12);
    telaVertices3=[
    0.0,0.0,0.0,
    2.0,0.0,0.0,
    1.0,1.7,0.0,
    0.0,1.0,0.0
    ];
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(telaVertices3), gl.DYNAMIC_DRAW);

//loop:
    posx=posx+0.2;
    telaVertices3[0]=posx;
    gl.bindBuffer(gl.ARRAY_BUFFER, puntosBuffer);
    gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array(telaVertices3));

但是它总是在相同的位置渲染!!!

最佳答案

我使用了对gl.bufferData(...)而不是gl.bufferSubData(...)的其他调用。我不知道这是否重要,但我认为这是我所做的唯一与您的示例不同的事情。

您可以在jax/buffer.js#L48上看到我当前的缓冲区管理实现,并在webgl/buffer.js#L26上看到一个旧版本。如您所见,我没有做任何特别的事情:

gl.bindBuffer(self.bufferType, buffer);
gl.bufferData(self.bufferType, instance, self.drawType);

您可以在webgldemos/md2的实时演示中观看动画。

然而

如果您打算一次更新很多顶点,那么这可能不是最好的方法。相反,我建议将相关数据发送到视频卡并直接在GLSL中执行动画,这样您就不会受到JavaScript速度的限制,并可以利用硬件加速的优势。实际上,我正在将大部分代码转换为这种方式。可以通过jax/blobularjax/meadow获得视频卡上顶点操作的两个实时示例。这些演示的源代码分别可以免费获得herehere

希望对您有帮助。

关于javascript - 在WebGL中动态更改顶点缓冲区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7166931/

10-12 13:14