我想在我的代码中访问原子计数器值。我的着色器是
#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);
counter 和 counter1 都是一样的