繁体   English   中英

计算着色器未写入缓冲区

[英]Compute Shader not writing to buffer

我正在寻找使用QOpenGLFunctions_4_3_Core OpenGL函数从Qt调用计算着色器的帮助。

具体来说,我对glDispatchCompute(1024, 1, 1);调用glDispatchCompute(1024, 1, 1); 似乎对绑定到它的缓冲区没有任何影响。 如何在QT中将缓冲区绑定到计算着色器,以便可以将着色器的结果读回到C ++

我创建了程序并将其与( Squircle.cpp )绑定:

    computeProgram_ = new QOpenGLShaderProgram();
    computeProgram_->addShaderFromSourceFile(QOpenGLShader::Compute, "../app/shaders/pointcloud.comp");
    computeProgram_->bindAttributeLocation("Particles", 0);
    m_ParticlesLoc = 0;

    computeProgram_->link();

然后将我的QOpenGLBuffer与( Squircle.cpp )绑定:

    // Setup our vertex buffer object.
    pointOpenGLBuffer_.create();
    pointOpenGLBuffer_.bind();
    pointOpenGLBuffer_.allocate(pointBuffer_.data(), pointBuffer_.vertexCount() * pointBuffer_.stride_);

然后,我使用( Squircle.cpp )调用计算着色器:

computeProgram_->bind();

// ... 

pointOpenGLBuffer_.bind();

glDispatchCompute(1024, 1, 1);

但是,当我使用read()map() 'ing读取缓冲区时,值永远不会改变,它们就是我最初插入的值。

从计算着色器的角度来看,我接受( pointcloud.comp )的输入:

#version 430

layout(local_size_x = 1024) in;

struct ParticleData
{
    vec4 position;
};

// Particles from previous frame
layout (std430, binding = 0) coherent buffer Particles
{
    ParticleData particles[];
} data;

我可能没有正确绑定缓冲区吗? 还是有另一个OpenGL命令要调用以实际调度计算? 我尝试了不同的用法,等等。

我已经在这里发布了所有相关代码。

似乎问题出在对缓冲区绑定的理解不正确。

pointOpenGLBuffer_.bind(); 

仅将您的缓冲区绑定到OGL上下文,而不绑定到着色器缓冲区,两次调用都不会成功。

第二次而不是仅仅绑定,您需要致电

glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, pointOpenGLBuffer_.bufferId());

其中0来自您的布局(std430,绑定= 0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM