4

コード内のアトミック カウンター値にアクセスしたい。私のシェーダーは

#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 の両方が同じ

4

0 に答える 0