Problem with getting array of vec3 from SSBO in OpenGL 4.3 Compute Shaders

25 Views Asked by At

I was making a terrain-mesh-generating compute shader which would have a buffer like this:

// Buffer for the final mesh data
layout (std430, binding = 0) buffer Data_OUT {
     dvec3 data[];
};

which I would write to in the main() function:

void main() {
     data[0] = dvec3(1.0, 2.0, 3.0);
     data[1] = dvec3(4.0, 5.0, 6.0);
     data[2] = dvec3(7.0, 8.0, 9.0);
     data[3] = dvec3(10.0, 11.0, 12.0);
     data[4] = dvec3(13.0, 14.0, 15.0);
     data[5] = dvec3(16.0, 17.0, 18.0);
     data[6] = dvec3(19.0, 20.0, 21.0);
     data[7] = dvec3(22.0, 23.0, 24.0);
}

In main.cpp it looks like this:

unsigned int cubeMeshSSBO;
glGenBuffers(1, &cubeMeshSSBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, cubeMeshSSBO);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(double) * 8 * 3, NULL, GL_DYNAMIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, cubeMeshSSBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);

glUseProgram(shaderProgramId);
glDispatchCompute(x, y, z);
glMemoryBarrier(GL_ALL_BARRIER_BITS);

double data[8][3];
glBindBuffer(GL_SHADER_STORAGE_BUFFER, cubeMeshSSBO);
glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, sizeof(double) * 8 * 3, &data);

std::cout << data[0][0] << " " << data[0][1] << " " << data[0][2] << std::endl;
std::cout << data[1][0] << " " << data[1][1] << " " << data[1][2] << std::endl;
std::cout << data[2][0] << " " << data[2][1] << " " << data[2][2] << std::endl;
std::cout << data[3][0] << " " << data[3][1] << " " << data[3][2] << std::endl;
std::cout << data[4][0] << " " << data[4][1] << " " << data[4][2] << std::endl;
std::cout << data[5][0] << " " << data[5][1] << " " << data[5][2] << std::endl;
std::cout << data[6][0] << " " << data[6][1] << " " << data[6][2] << std::endl;
std::cout << data[7][0] << " " << data[7][1] << " " << data[7][2] << std::endl;

glDeleteBuffers(1, &cubeMeshSSBO);

When i run it the console outputs the following:

1  2  3
0  4  5
6  0  7
8  9  0
10 11 12
0  13 14
15 0  16
17 18 0

, but the expected output should be:

1  2  3
4  5  6
7  8  9
10 11 12
13 14 15
16 17 18
19 20 21
22 23 24

The weird this is that if i change everything over to be a dvec4 and make main.cpp expect that type it works fine and as expected.

Ive tried with just vec3 and it acted similarly, but same as with dvec4 the vec4 seems to work flawlessly.

0

There are 0 best solutions below