我试图在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一起去微软而不是Cyberdyne。
P.S。我在Arch Linux中使用Cmake创建发布版本,一切都像Avtomat Kalashnikova一样,所以至少在Linux Qt OpenGL中有用。如果我找到足够的时间,我将尝试在Windows中使用Cmake和MinGW。