2017-02-24 47 views
0

我正在尋找使用QOpenGLFunctions_4_3_Core OpenGL函數從Qt調用計算着色器的幫助。計算着色器不寫入緩衝區

具體而言,我對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()',值都不會改變,它們就是我最初插入的內容。

從計算着色器的角度來看,我接受我的(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命令調用來實際調度計算?我嘗試了不同的用法等。

我已經發布了所有相關的代碼here

回答

2

看來這個問題是在錯誤的緩衝綁定理解。

pointOpenGLBuffer_.bind(); 

只有結合你的緩衝區,以您的OGL背景下,而不是你的着色器緩衝器,稱這兩次不會做的伎倆。

第二次,而不是隻綁定你需要調用

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

,其中0來自您的佈局(std430,結合= 0)

+0

它的工作!我昨天晚上也讀過了這個功能,但由於某種原因沒有嘗試。我也認爲我的注意力被我正在使用的'Format'所捕獲(我指定'Core4.3',但當前緩衝區使用'Compatibility4.5')但是,謝謝!我自己辛苦工作的16個小時錯過了這個解決方案。 :) – Matt

相關問題