在 WebGL 中使用 UniformBuffers
Using UniformBuffers in WebGL
我在获得一些 OpenGL 经验后正在试用 WebGL,我想在 WebGL 中使用 UBO。我在 OpenGL 中使用此代码:
UniformBuffer::UniformBuffer(int bufferSize, int binding) {
glGenBuffers(1, &buffer);
glBindBuffer(GL_UNIFORM_BUFFER, buffer);
glBufferData(GL_UNIFORM_BUFFER, bufferSize, NULL, GL_STATIC_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
glBindBufferRange(GL_UNIFORM_BUFFER, binding, buffer, 0, bufferSize);
}
void UniformBuffer::modifyData(int size, int offset, float *data) {
glBindBuffer(GL_UNIFORM_BUFFER, buffer);
glBufferSubData(GL_UNIFORM_BUFFER, offset, size, data);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
}
void UniformBuffer::addToShader(Shader *shader, std::string name, int binding) {
glUniformBlockBinding(shader->getProgram(), glGetUniformBlockIndex(shader->getProgram(), name.c_str()), binding);
}
并将其移植到 WebGL 中的这段代码:
var viewMatBuffer = gl.createBuffer();
gl.bindBuffer(gl.UNIFORM_BUFFER, viewMatBuffer);
gl.bufferData(gl.UNIFORM_BUFFER, 4 * 16, null, gl.STATIC_DRAW);
gl.bindBuffer(gl.UNIFORM_BUFFER, null);
gl.bindBufferRange(gl.UNIFORM_BUFFER, 0, viewMatBuffer, 0, 4 * 16);
gl.uniformBlockBinding(basicShader.getProgram(), gl.getUniformBlockIndex(basicShader.getProgram(), "viewBlock"), 0);
gl.bindBuffer(gl.UNIFORM_BUFFER, viewMatBuffer);
gl.bufferSubData(gl.UNIFORM_BUFFER, 0, 4 * 16, viewMatrix);
gl.bindBuffer(gl.UNIFORM_BUFFER, null);
我没有把它变成class,因为我想先测试一下。 运行 该代码产生此错误:
[Error] Unhandled Promise Rejection: TypeError: Argument 2 ('data') to WebGL2RenderingContext.bufferData must be an instance of ArrayBufferView
如何修复此错误以及我的代码中也存在的其他错误?
这个函数调用是错误的
gl.bufferData(gl.UNIFORM_BUFFER, 4 * 16, null, gl.STATIC_DRAW);
如果您只是想分配一个缓冲区而不想将数据放入其中
gl.bufferData(gl.UNIFORM_BUFFER, 4 * 16, gl.STATIC_DRAW);
在WebGL2中有一个使用统一缓冲区的例子here
我在获得一些 OpenGL 经验后正在试用 WebGL,我想在 WebGL 中使用 UBO。我在 OpenGL 中使用此代码:
UniformBuffer::UniformBuffer(int bufferSize, int binding) {
glGenBuffers(1, &buffer);
glBindBuffer(GL_UNIFORM_BUFFER, buffer);
glBufferData(GL_UNIFORM_BUFFER, bufferSize, NULL, GL_STATIC_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
glBindBufferRange(GL_UNIFORM_BUFFER, binding, buffer, 0, bufferSize);
}
void UniformBuffer::modifyData(int size, int offset, float *data) {
glBindBuffer(GL_UNIFORM_BUFFER, buffer);
glBufferSubData(GL_UNIFORM_BUFFER, offset, size, data);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
}
void UniformBuffer::addToShader(Shader *shader, std::string name, int binding) {
glUniformBlockBinding(shader->getProgram(), glGetUniformBlockIndex(shader->getProgram(), name.c_str()), binding);
}
并将其移植到 WebGL 中的这段代码:
var viewMatBuffer = gl.createBuffer();
gl.bindBuffer(gl.UNIFORM_BUFFER, viewMatBuffer);
gl.bufferData(gl.UNIFORM_BUFFER, 4 * 16, null, gl.STATIC_DRAW);
gl.bindBuffer(gl.UNIFORM_BUFFER, null);
gl.bindBufferRange(gl.UNIFORM_BUFFER, 0, viewMatBuffer, 0, 4 * 16);
gl.uniformBlockBinding(basicShader.getProgram(), gl.getUniformBlockIndex(basicShader.getProgram(), "viewBlock"), 0);
gl.bindBuffer(gl.UNIFORM_BUFFER, viewMatBuffer);
gl.bufferSubData(gl.UNIFORM_BUFFER, 0, 4 * 16, viewMatrix);
gl.bindBuffer(gl.UNIFORM_BUFFER, null);
我没有把它变成class,因为我想先测试一下。 运行 该代码产生此错误:
[Error] Unhandled Promise Rejection: TypeError: Argument 2 ('data') to WebGL2RenderingContext.bufferData must be an instance of ArrayBufferView
如何修复此错误以及我的代码中也存在的其他错误?
这个函数调用是错误的
gl.bufferData(gl.UNIFORM_BUFFER, 4 * 16, null, gl.STATIC_DRAW);
如果您只是想分配一个缓冲区而不想将数据放入其中
gl.bufferData(gl.UNIFORM_BUFFER, 4 * 16, gl.STATIC_DRAW);
在WebGL2中有一个使用统一缓冲区的例子here