我必须做哪些布局和绑定才能使(工作的)着色器存储缓冲区在第二个着色器程序中可读?我设置并填充了一个成功绑定并在几何着色器中使用的 SSBO。该着色器读取和写入该 SSBO - 到目前为止没有问题。那里没有进行渲染。
在下一步中,我的渲染通道(第二个着色器程序)应该可以访问这些数据。这个想法是拥有一个大数据集,而第二个程序的顶点着色器只使用每个渲染调用的一些索引来选择该 SSBO 的某些值。
我错过了一些特定的绑定命令还是我把它们放在了错误的位置?
两个程序的布局是否一致?我搞砸了实例吗?
我只是找不到在两个程序中使用的 SSBO 的任何示例..
创建、填充和绑定:
float data[48000];
data[0] = -1.0;
data[1] = 1.0;
data[2] = -1.0;
data[3] = -1.0;
data[4] = 1.0;
data[5] = -1.0;
data[6] = 1.0;
data[7] = 1.0;
data[16000] = 0.0;
data[16001] = 1.0;
data[16002] = 0.0;
data[16003] = 0.0;
data[16004] = 1.0;
data[16005] = 0.0;
data[16006] = 1.0;
data[16007] = 1.0;
GLuint ssbo;
glGenBuffers(1, &ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(data), &data, GL_DYNAMIC_COPY);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, ssbo);
在几何着色器中实例化
layout(std140, binding = 1) buffer mesh
{
vec2 points[8000];
vec2 texs[8000];
vec4 colors_and_errors[8000];
} mesh_data;
另一个程序的顶点着色器中的第二个实例
layout(std140, binding = 1) buffer mesh
{
vec2 points[8000];
vec2 texs[8000];
vec4 colors_and_errors[8000];
} mesh_data;
实例是否相互对抗?现在我没有在渲染循环中发布我的绑定,因为我不确定我在那里做什么。我尝试在更改使用的程序之前/之后进行绑定;没有成功。
有人有想法吗?
编辑:我是否还必须将 SSBO 绑定到渲染循环之外的第二个程序?以不同于第一次绑定的方式?
编辑:虽然我没有解决这个特定的问题,但我发现了一种在 opengl 的意义上可能更多的解决方法。
我在第二个程序中使用了第一个程序的 SSBO 作为顶点属性。这和opengl的索引渲染功能解决了这个问题。
(这应该标记为已解决吗?)