![](/img/trans.png)
[英]Vanilla Vulkan Compute Shader not writing to output buffer
[英]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.