2016-02-01 1 views
1

J'essaye d'utiliser un shader de calcul pour écrire dans un buffer.le shader de calcul n'écrira pas dans le tampon

Configuration du tampon:

glCreateBuffers(1, &m_ssbo); 
glNamedBufferStorage(m_ssbo, 1920 * 1080 * 4 * sizeof(GLfloat), nullptr, GL_MAP_WRITE_BIT | GL_MAP_READ_BIT | GL_DYNAMIC_STORAGE_BIT); 

Compute Shader:

#version 450 core 
layout (local_size_x = 1) in; 
layout(std430, binding = 0) restrict writeonly buffer SSBO { 
    vec4 color[]; 
}; 
void main() { 
    color[0] = vec4(1., 0., 0., 1.); 
} 

Dispatch et lecture:

m_comp_prog.use(); 
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_ssbo); 
glDispatchCompute(1, 1, 0); 
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); 

{ 
    auto * ptr = m_ssbo.map(0, static_cast<unsigned int>(sizeof(GLfloat)) * 4, GL_MAP_READ_BIT); 
    GLfloat * fptr = static_cast<GLfloat *>(ptr); 
    std::cout << fptr[0] << std::endl; 
    m_ssbo.unmap(); 
} 

La sortie est cependant 0 et non 1.

Répondre

2

Il semble que vous re jamais exécuter le shader:

glDispatchCompute(1, 1, 0); 

Bien que non mentionné dans la référence, this page indicatest que l'analyse syntaxique 0 à l'un des arguments n'est pas autorisé. Ceci peut être expliqué puisque num_group_x * num_group_y * num_group_z groupes de travail sont créés, ce qui signifie que les non sont créés avec ces paramètres (1 * 1 * 0 = 0).

Pour résoudre le problème, essayez d'appeler

glDispatchCompute(1, 1, 1); 
         ^

à la place, qui va créer exactement un groupe de travail.

+0

Oh mec, une erreur si simple. Merci! – gartenriese