简体   繁体   English

WebGL2 中统一缓冲区的问题

[英]Problems with Uniform Buffers in WebGL2

I am trying to port some OpenGL code to WebGL2 and I have some problems with Uniform Buffers.我正在尝试将一些 OpenGL 代码移植到 WebGL2,但我在使用统一缓冲区时遇到了一些问题。 Everything I render with the shader the buffer is attached to is no longer displayed.我使用缓冲区附加到的着色器渲染的所有内容都不再显示。 I get no errors or warnings in the console.我在控制台中没有收到错误或警告。 This is my code:这是我的代码:

var data = new Float32Array(1);
data[0] = 1.0;

var uniformBuffer = gl.createBuffer();
gl.bindBuffer(gl.UNIFORM_BUFFER, uniformBuffer);
gl.bufferData(gl.UNIFORM_BUFFER, 4, gl.STATIC_DRAW);
gl.bindBufferRange(gl.UNIFORM_BUFFER, 0, uniformBuffer, 0, 4);

gl.uniformBlockBinding(mapShader.getProgram(), gl.getUniformBlockIndex(mapShader.getProgram(), "test"), 0);


gl.bindBuffer(gl.UNIFORM_BUFFER, uniformBuffer);
gl.bufferSubData(gl.UNIFORM_BUFFER, 0, data);
gl.bindBuffer(gl.UNIFORM_BUFFER, null);

Once I add this to my shader the problems I described earlier appear:一旦我将它添加到我的着色器中,我之前描述的问题就会出现:

layout (std140) uniform test {
    float testFloat;
};

Next time please be kind and save us from having to manually make a repo!下次请善待我们,让我们不必手动制作回购! Thanks 🙇‍♂️谢谢🙇‍♂️

When I run your code in Chrome I get当我在 Chrome 中运行你的代码时,我得到

:GL_INVALID_OPERATION : glDrawArrays: uniform buffers : buffer or buffer range at index 0 not large enough :GL_INVALID_OPERATION : glDrawArrays: 统一缓冲区: 索引 0 处的缓冲区或缓冲区范围不够大

The problem is there are padding and alignment issues问题是存在填充和对齐问题

See the spec section 2.12.6.4请参阅规范第 2.12.6.4 节

Changing your buffer and range size to 16 and it works.将缓冲区和范围大小更改为 16,它就可以工作了。 Also note there are alignment requirements for valid offsets to BindBufferRange you can look up with gl.getParameter(gl.UNIFORM_BUFFER_OFFSET_ALIGNMENT)另请注意,您可以使用gl.getParameter(gl.UNIFORM_BUFFER_OFFSET_ALIGNMENT)查找BindBufferRange有效偏移量的对齐要求

 const gl = document.querySelector('canvas').getContext('webgl2'); const vs = `#version 300 es void main() { gl_PointSize = 100.0; gl_Position = vec4(0, 0, 0, 1); } `; const fs = `#version 300 es precision highp float; layout (std140) uniform test { float testFloat; }; out vec4 outColor; void main() { outColor = vec4(testFloat, 0, 0, 1); } `; const prg = twgl.createProgram(gl, [vs, fs]); gl.useProgram(prg); const mapShader = { getProgram: _ => prg, }; var data = new Float32Array(1); data[0] = 1.0; var uniformBuffer = gl.createBuffer(); gl.bindBuffer(gl.UNIFORM_BUFFER, uniformBuffer); gl.bufferData(gl.UNIFORM_BUFFER, 16, gl.STATIC_DRAW); gl.bindBufferRange(gl.UNIFORM_BUFFER, 0, uniformBuffer, 0, 16); gl.uniformBlockBinding(mapShader.getProgram(), gl.getUniformBlockIndex(mapShader.getProgram(), "test"), 0); gl.bindBuffer(gl.UNIFORM_BUFFER, uniformBuffer); gl.bufferSubData(gl.UNIFORM_BUFFER, 0, data); gl.bindBuffer(gl.UNIFORM_BUFFER, null); gl.drawArrays(gl.POINTS, 0, 1);
 <script src="https://twgljs.org/dist/4.x/twgl.min.js"></script> <canvas></canvas>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM