PixelBuffer操作在Release build Qt5.6 MSVS2013

时间:2016-05-31 10:33:39

标签: visual-studio opengl qt5

我试图在MSVS2013 express中构建Qt5.6项目(我在Linux下用QtCreator编写了所有代码)。首先在Visual Studio中我只能在Release模式下构建它,它工作正常。然后我使用windeployqt.exe实用程序来创建部署包。我也把assimp32.dll(我用它来模型加载)。 一切正常,除了PIXEL_BUFFER功能(我在附加的Framebuffer中绘制一些东西到纹理,对绘制结果进行一些分析,准备另一个纹理并将其推送到绘图中)。

我在Dependency Walker(msvcr90.dll,Dcomp.dll,API-MS-WIN-CORE - *。dll)中遇到了一些错误,即使我已经安装了存在于其中的每个MS Redistributable垃圾这个世界。

这是我尝试使用的代码:

void AUVGBO::PrepareGBO(QOpenGLShaderProgram *shader) {
    if (mEnabled) {
        this->PrepareRender(shader, AUVCamera::PR_PROJECTION | AUVCamera::PR_VIEW | AUVCamera::PR_VIEW_POS | AUVCamera::PR_LIGHT | AUVCamera::PR_LIGHT_POS );
        // Attach framebuffer for intermediate rendering
        m_GL->glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
        m_GL->glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        m_GL->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        m_GL->glViewport(0, 0, mGBO_Width, mGBO_Height);
    }
}

void AUVGBO::FinishGBO(QOpenGLShaderProgram *shader) {
    // Read pixels from FBO texture
    GLuint indexAsync = mPBO_inIndex;
    GLuint indexSync = (mPBO_inIndex + 1) % PBO_NUM;

    // Bind pixel buffer for asynchronous reading from framebuffer
    m_GL->glReadBuffer(GL_COLOR_ATTACHMENT0);
    m_GL->glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO_in[indexAsync]);
    m_GL->glReadPixels(0, 0, mGBO_Width, mGBO_Height, GL_RGB, GL_FLOAT, 0);   // This call will be async

    if (firstAsyncCalls && ( indexSync != 0 )) {
        mPBO_inIndex = indexSync;
        return;
    } else {
        firstAsyncCalls = false;
    }

    // Bind pixel buffer which already has data fetched one step ago
    m_GL->glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO_in[indexSync]);
    memcpy(mGBO_Pixels,
           m_GL->glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_WRITE),
           mGBO_Size * 3 * sizeof(GLfloat));
    m_GL->glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
    m_GL->glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

    // Swap buffer for sync/async readback
    mPBO_inIndex = indexSync;
    m_GL->glBindFramebuffer(GL_FRAMEBUFFER, 0);

所以现在内存区域中的每个像素[mGBO_Pixels:mGBO_Size * 3 * sizeof(GLfloat)]都是黑色的,但它们应该不是黑色的。我把(测试)0.12345f值放在每个像素的第三个字节

color = vec4(cos, length(r), 0.12345f, 1.0f);

但如果运行exe文件,(mGBO_Pixels + 2)为0.0。但在VS中,一切都很好,因为我已经说过了((mGBO_Pixels + 2)= 0.12345f)。

我发现了一些SO答案,人们说它可能是Qt openGL错误(他们的应用程序崩溃在initializeGLContext()的东西),但在我的情况下推动创建纹理到openGL是好的。所以我想我在某个地方犯了一个错误。它让我疯狂。呵呵。希望Sara和John Conor与T800一起去微软而不是Cyber​​dyne。

P.S。我在Arch Linux中使用Cmake创建发布版本,一切都像Avtomat Kalashnikova一样,所以至少在Linux Qt OpenGL中有用。如果我找到足够的时间,我将尝试在Windows中使用Cmake和MinGW。

0 个答案:

没有答案