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

时间:2016-08-31 14:21:52

标签: 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);

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

#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);

1 个答案:

答案 0 :(得分:1)

好的,我发现了使用红皮书的问题。我没有正确绑定缓冲区,并且在缓冲数据之后发生了绑定缓冲区基础:

<div class="social">
  <ul class="sociallinks">
    <li>
      <a href="#">
        <img class="changeableImage" src="http://free4kwallpaper.com/wp-content/uploads/nature/Colorful-UHD-4K-Mountains-Wallpaper-300x200.jpg" />
      </a>
      <br>
      <a class="changeableBG" href="#">
        <img  src="http://free4kwallpaper.com/wp-content/uploads/nature/Colorful-UHD-4K-Mountains-Wallpaper-300x200.jpg" />
      </a>
    </li>
  </ul>
</div>