opengl - 使用 SSBO 作为下一次绘制调用的 VBO 输入

标签 opengl synchronization shader vbo

我在着色器中向 SSBO 写入了一些顶点数据。然后我想将写入 SSBO 的数据用作 VBO。这些将用于下一次绘制调用。如何才能做到这一点?

这是,我现在是怎么做的,但它仍然是段错误:

int new_vertex_count = …;
int new_index_count = …;
int* new_indices = …;

GLuint ssbo[3];
glGenBuffers(3, ssbo);


glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo[1]);
glBufferData(GL_SHADER_STORAGE_BUFFER, new_vertex_count * 3 * sizeof(float), nullptr, GL_DYNAMIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ssbo[1]);

glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo[2]);
glBufferData(GL_SHADER_STORAGE_BUFFER, new_vertex_count * 2 * sizeof(float), nullptr, GL_DYNAMIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, ssbo[2]);

glBindVertexArray(vao); //bind the original VAO
glPatchParameteri(GL_PATCH_VERTICES, 16);
glEnable(GL_RASTERIZER_DISCARD); //disable displaying
glDrawElements(GL_PATCHES, index_count, GL_UNSIGNED_INT, 0); //don't draw, just 
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); //sync writing
glFinish();
glDisable(GL_RASTERIZER_DISCARD); //reanable displaying for next draw call
glBindVertexArray(0); //unbind original VAO in order to use new VBOs


glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ssbo[0]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_count * sizeof(uint), indices, GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER, ssbo[1]); //bind SSBO as VBO, is this even possible?
//or should I use new VBOs and copy? How would I copy then?
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

glBindBuffer(GL_ARRAY_BUFFER, ssbo[2]);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0);

glDrawElements(GL_PATCHES, new_index_count, new_indices, GL_UNSIGNED_INT, 0); //here the real drawing

最佳答案

没有“SSBO”或“VBO”这样的东西。只有缓冲区对象。存储块和顶点数组用于缓冲区对象,但特定缓冲区并不与特定用途固有地相关联。没有什么可以阻止您通过存储块写入缓冲区,然后在渲染操作中从中读取。

只要你遵守incoherent memory access的规则当然,对于那些写作。除非您明确使它们可用,否则通过存储块的写入不可用于读取操作。您将使用 glMemoryBarrier为了这。和方式memory barrier works是枚举器指定了您希望能够看到所写内容的结果的操作。

您希望将写入的数据作为顶点属性数组读取。所以你使用:

glMemoryBarrier(GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT​);

关于opengl - 使用 SSBO 作为下一次绘制调用的 VBO 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45174432/

相关文章:

java - OpenGL slick-util 缺少类 : UnicodeFont not included in . jar

c++ - 使用多个 Canvas 时,FTGL 纹理字体仅显示黑框

c# - 未在 cmd 提示符下运行时,OpenGL 未显示正确的输出

java - interned 字符串上的嵌套同步块(synchronized block)

java - 同步 map 内的集合

math - 快速、不准确的 sin 函数,无需查找

c - 无法使用 OpenGL 3.3 上下文 macOS 创建窗口,并且通过 brew 安装了 GLFW

java - 创建两个不同的线程

unity3d - 如何在Shader属性中定义 float 组?

opengl-es - 为什么必须为片段着色器设置精度?