Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to bind shader buffer blocks using glShaderStorageBinding?

Using OpenGL 4.3, I want to know how to bind shader buffer blocks using glShaderStorageBinding.

'binding' qualifiers works fine, but I don't want to use them.

I have written the following code:

    GLint i=0, j=0, Ibuffer[32], *Obuffer;
    GLuint shader_buffer[2], buffer_index;

   for(i=0; i<32; i++)  
   {
       Ibuffer[i]=1;

   }

    Obuffer=(GLint*) malloc(32*sizeof(GLint));

glGenBuffers(2, shader_buffer, nResult);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, shader_buffer[0]);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(Ibuffer), Ibuffer, GL_DYNAMIC_DRAW);

glBindBuffer(GL_SHADER_STORAGE_BUFFER, shader_buffer[1], nResult);
glBufferData( GL_SHADER_STORAGE_BUFFER, 32*sizeof(GLint), NULL, GL_DYNAMIC_READ);
GLint x;
glGetIntegerv(GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, &x);
glUseProgram(computeshaderprogObj);
buffer_index=glGetProgramResourceIndex(computeshaderprogObj, GL_SHADER_STORAGE_BLOCK, "iB");
printf("buffer_index = %d GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = %d", buffer_index, x);
glShaderStorageBlockBinding(computeshaderprogObj, buffer_index, 0);

buffer_index=glGetProgramResourceIndex(computeshaderprogObj, GL_SHADER_STORAGE_BLOCK, "oB");
printf("buffer_index = %d", buffer_index);
glShaderStorageBlockBinding(computeshaderprogObj, buffer_index, 1);

glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, shader_buffer[0]);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, shader_buffer[1]);

 glDispatchCompute(4, 1, 1);
 glBindBuffer(GL_SHADER_STORAGE_BUFFER, shader_buffer[1]);
 Obuffer = (GLint*)glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(GLint)*32, GL_MAP_READ_BIT); 
 // Reading the buffer
 glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);

Compute Shader:

layout (local_size_x = 32, local_size_y = 1, local_size_z = 1) in;
layout(std140) buffer iB {
   int ibuf[];
}g_in;

layout(std140) buffer oB {
  int obuf[];
}g_out;
void main() {
uint LocalInvocationIndex = gl_LocalInvocationIndex;
g_out.obuf[LocalInvocationIndex] = g_in.ibuf[LocalInvocationIndex];
  }

Expecting result as 1, but returning value as 0 in Obuffer.

output:
buffer_index = 0 GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 96
buffer_index = 1
value at Obuffer[1]=0
like image 789
user1896853 Avatar asked Jan 19 '26 21:01

user1896853


1 Answers

I found the answer, it was giving wrong because of the 'std140' layout. It was saving result as 1000, 1000, 1000, etc.. Thus changed the layout qualifier as packed. Thanks.

like image 112
user1896853 Avatar answered Jan 22 '26 10:01

user1896853



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!