如何使用着色器存储缓冲区读取原子计数器值

时间:2013-09-30 09:38:17

标签: opengl

我想在我的代码中访问原子计数器值。我的着色器是

#version 430
#extension GL_EXT_compute_shader : enable
layout (local_size_x = 16, local_size_y = 16) in;
layout (binding = 0) uniform atomic_uint atRed;
layout(std140,binding = 0) buffer myBuffer
{
uint red;
uint inc_red;
}g_out;

void main() {
    g_out.inc_red=0;
    g_out.inc_red+=atomicCounterIncrement(atRed);
    g_out.inc_red+=atomicCounterIncrement(atRed);
    g_out.inc_red+=atomicCounterIncrement(atRed);
    g_out.inc_red+=atomicCounterIncrement(atRed);
    g_out.inc_red+=atomicCounterIncrement(atRed);
    g_out.inc_red+=atomicCounterIncrement(atRed);
    g_out.inc_red+=atomicCounterIncrement(atRed);
    g_out.inc_red+=atomicCounterIncrement(atRed);
    g_out.inc_red+=atomicCounterIncrement(atRed);
    g_out.inc_red+=atomicCounterIncrement(atRed);
    g_out.inc_red+=atomicCounterIncrement(atRed);
    g_out.inc_red+=atomicCounterIncrement(atRed);
    g_out.inc_red+=atomicCounterIncrement(atRed);

    g_out.red=atomicCounterIncrement(atRed);


 }

在我的访问中,我使用以下代码访问这些值

GLuint*  counter=NULL;
glGenBuffers(1, &shaderStorageBufferID);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, shaderStorageBufferID);
glBufferData(GL_SHADER_STORAGE_BUFFER, 2*sizeof(GLuint), NULL ,GL_STATIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0,shaderStorageBufferID );
glUseProgram(tdk_ShaderObject.cpsId);
glDispatchCompute(16,16,1);
counter = (GLuint*) glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0,2*sizeof(GLuint),   GL_MAP_READ_BIT );
printf("counter %d %d",*counter,*(counter+1));


glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);

它将计数器值设为0 0。 上面的代码有什么问题吗?

此问题现已解决。解决方案

GLuint* counters=(GLuint*)tdkMalloc(sizeof(GLuint));
GLuint*  counter;
GLuint*  counter1;
*counters=1000;
glGenBuffers(1, &atomicsBuffer);
glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, atomicsBuffer);

glUseProgram(cpsId);

glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint) * 1,counters, GL_STATIC_DRAW);
glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, atomicsBuffer);
GLuint shaderStorageBufferID;

glGenBuffers(1, &shaderStorageBufferID);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, shaderStorageBufferID);
glBufferData(GL_SHADER_STORAGE_BUFFER, 1*sizeof(GLuint), NULL ,GL_STATIC_READ);
int buffer_index=tdk_glGetProgramResourceIndex(tdk_ShaderObject.cpsId, GL_SHADER_STORAGE_BLOCK, "myBuffer", nResult);
printf("buffer_index = %d", buffer_index);
glShaderStorageBlockBinding(tdk_ShaderObject.cpsId, buffer_index, 0);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0,shaderStorageBufferID);
glDispatchCompute(1,1,1,nResult);
counter = (GLuint*) glMapBufferRange(GL_ATOMIC_COUNTER_BUFFER, 0,1*sizeof(GLuint),  GL_MAP_READ_BIT|GL_MAP_WRITE_BIT );


printf("counter %d",*counter);


counter1 = (GLuint*) glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0,1*sizeof(GLuint), GL_MAP_READ_BIT|GL_MAP_WRITE_BIT   );
Printf("counter %d",*counter1);
tdk_glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER,nResult);
tdk_glUnmapBuffer(GL_SHADER_STORAGE_BUFFER,nResult);

计数器和计数器1都相同

0 个答案:

没有答案