c++ - 从顶点着色器中修改着色器存储缓冲区对象

标签 c++ opengl glsl opengl-4

在我的基础程序 (C++/OpenGL 4.5) 中,我已将顶点缓冲区的内容复制到着色器存储缓冲区 (SSBO):

float* buffer = (float*) glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, ssbo[2]);

glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GLfloat)*size,buffer, GL_DYNAMIC_DRAW);

glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, 0);
glUnmapBuffer(GL_ARRAY_BUFFER);

顶点着色器中,此数据绑定(bind)到一个数组:

#version 430
#extension GL_ARB_shader_storage_buffer_object : require

layout(shared, binding = 3) buffer storage
{
    float array[];
}

但是当我尝试覆盖 main 函数中的数组条目时,如下所示:

array[index_in_bounds] = 4.2;

没有任何反应。

我做错了什么?我可以从顶点着色器中更改缓冲区吗?这只能在几何着色器中实现吗?我是否必须使用转换反馈(我以前从未使用过)来执行此操作?

编辑: 我在主程序中映射缓冲区以进行测试,只是为了查看数据是否发生变化:

float* buffer = (float*) glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY);
float* ssbo = (float*) glMapNamedBuffer(3, GL_READ_ONLY);

for(int i = 0; i < SIZE_OF_BUFFERS; i++)
    printf("% 5f | % 5f\n", ssbo[i], buffer[i]);

glUnmapNamedBuffer(3);
glUnmapBuffer(GL_ARRAY_BUFFER);

最佳答案

好的,我已经使用红书找到了问题所在。我没有正确绑定(bind)缓冲区,并且必须在缓冲数据之后绑定(bind)缓冲区基础:

float* buffer = (float*) glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, &ssbo); // bind buffer

// switched these two:
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GLfloat)*size,buffer, GL_DYNAMIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, &ssbo);

glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); // unbind buffer
glUnmapBuffer(GL_ARRAY_BUFFER);

关于c++ - 从顶点着色器中修改着色器存储缓冲区对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39252215/

相关文章:

c++ - switch 语句中的静态变量

javascript - 将 THREE.js 着色器转换为 PIXI.js

opengl-es - 不带 ftransform() 的桌面 GLSL

c++ - 顶点着色器错误 C5145 : must write to gl_Position using QShaderProgram

c# - 混合 C#\C++ 应用程序中的 NLog

c++ - 有序元素的最佳容器

c++ - 我必须在析构函数中设置指向 nullptr 的指针吗?

java - 在 iphone 或 Java 上实现像 Scorched Earth Game 这样的地形破坏

c++ - 计算每个顶点的法线 OpenGL

c++ - 如何使用 C++/OpenGL 加载透明背景的图标并正确显示?