小编use*_*079的帖子

qmake额外的编译器,每个文件有多个输出

如未记载的qmake中所述,我在qmake项目文件中声明了一个额外的编译器:

TEST = somefile.h

test_c.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}_1.cpp
test_c.input = TEST
test_c.commands = C:/somedir/some.exe /i ${QMAKE_FILE_IN} /o ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}_1.cpp
test_c.variable_out = SOURCES
test_c.name = MyTestC

QMAKE_EXTRA_COMPILERS += test_c
Run Code Online (Sandbox Code Playgroud)

这很好用.但我也想生成一个头文件.我可以轻松地创建第二个自定义工具来解析此文件(或文件,如果> 1将在TEST中),但我不想解析每个文件两次.我试过了:

test_c.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}_1.cpp \
    ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}_2.cpp
Run Code Online (Sandbox Code Playgroud)

只是为了测试额外的编译器每次运行可以生成两个文件.我期待像" file somefile_2.cpp doesn't exist" 这样的错误,但项目编译没有错误,第二个输出文件被忽略.在Makefile somefile_2.cpp中不存在.

现在我想到两个变种:

  1. 创建一个额外的编译器来生成存档,其中所有需要的输出文件将立即保存.设置tool1.variable_out = TOOL_1_OUT并添加两个额外的编译器,toolN.input = TOOL_1_OUT只需"解压缩"存档文件(每个工具一个)并将它们附加到一些变量.

    在这种情况下,每个输入文件将调用三次执行.这不是最佳的,但至少解析器每个文件只运行一次.

  2. 尝试.output_function选项.创建一个qmake函数,返回与.output现在相同的名称,但也附加第二个文件名HEADERS.

PS我使用的是MinGW x32 4.7,QtCreator 2.7.1,Qt 5.1.0,C++ 11.

qmake

5
推荐指数
1
解决办法
2661
查看次数

在 Qml 场景下使用 OpenGL 渲染时出现奇怪的错误

作为一种爱好,我正在试验 OpenGL,并用 Qt+OpenGL 编写我自己的愚蠢引擎。最后一个成功是构建实体系统框架,该框架可以使用附加的物理引擎 (BulletPhysics) 渲染带有阴影的场景(通过渲染到纹理到 RenderBuffer)。

之后我更新到 Qt 5.2 并完全由 Qml 表达(之前没有尝试使用它)。我对 2d qml 图形进行了一些实验,并决定将 qml 用于用户界面,但拒绝 2d 项目并返回到 3d。我创建了新的 qml 项目,尝试在 qml 下渲染一些东西,如Scene Graph - OpenGL Under QML示例。之后,我将旧代码从 3d 项目移动到新项目,并进行了一些小的重构(应该不会影响任何事情)。

在这一刻,我厌倦了一些奇怪的错误。似乎根据需要渲染了第一帧,但之后出现了问题。

场景视图 这是一个或多或少的正常帧(在任何移动之前)

在左上角我是输出深度缓冲区(阴影贴图)。在右上角,我使用 qml 制作了一些自定义滚动条。我正在使用此滚动条来更改阴影贴图旋转和移动相机。当滚动条居中时,什么都不会移动。当我改变一些东西时,场景变得丑陋,我不知道为什么。

一些阴影贴图旋转后的场景视图 这是一些阴影贴图旋转后的帧

我看到阴影贴图深度缓冲区没有改变(为什么?o_0)并且场景中的阴影出错了。但是将我的旧代码重构为qml项目后,不仅shadow失败了。当我移动相机时,错误变得更加奇怪。

向下移动相机后的场景 (-Z) 这是向下移动相机后的帧 (-Z)

使用以下方法在 qml 下渲染场景:

connect(window, &QQuickWindow::beforeRendering, this, &MyApp::renderScene, Qt::DirectConnection);
Run Code Online (Sandbox Code Playgroud)

在渲染场景 I 中:

  • 做一些 OpenGL 传送带设置(为了防止 Qml Scene Graph 的改变,可能是多余的);

    glViewport(0, 0, window->width(), window->height());
    
    glClearColor(0, 0, 0, 1);
    glClearDepth(1);
    glDepthRange(0,1);
    glDepthFunc(GL_LEQUAL);
    
    Run Code Online (Sandbox Code Playgroud)
  • 调用 BulletPhysics 来计算物理(在测试场景中 - 两个下落的立方体)

  • 将阴影贴图(仅深度)渲染到 RenderBuffer(2048x2048 纹理,GL_DEPTH_COMPONENT24) …

c++ opengl qt qml

5
推荐指数
1
解决办法
1828
查看次数

标签 统计

c++ ×1

opengl ×1

qmake ×1

qml ×1

qt ×1