跳转至

窗口全黑

1 设置颜色缓冲

在使用 VTK 和 Qt 集成时,需要注意 QVTKWidget 和 QVTKOpenGLWidget 的差异:

  • QVTKWidget 自带默认的 RenderWindow,颜色缓冲等属性通常已经初始化。
  • QVTKOpenGLWidget 则没有默认的 RenderWindow,如果继承或重写,需要显式设置 QSurfaceFormat 来确保颜色缓冲正确。

示例代码如下:

#include <QApplication>
#include <QSurfaceFormat>
#include <QVTKOpenGLWidget.h>
#include <vtkOpenGLRenderWindow.h>
#include <vtkOutputWindow.h>

int main(int argc, char *argv[]) {
    // 关闭 VTK 全局警告输出
    vtkOutputWindow::SetGlobalWarningDisplay(0);

    // 设置 OpenGL 多重采样最大值(抗锯齿)
    vtkOpenGLRenderWindow::SetGlobalMaximumNumberOfMultiSamples(8);

    // 设置 QVTKOpenGLWidget 默认的 QSurfaceFormat
    QSurfaceFormat::setDefaultFormat(QVTKOpenGLWidget::defaultFormat()); 

    QApplication app(argc, argv);

    // 创建主窗口
    FormTitle mainWindow;
    mainWindow.show();

    return app.exec();
}

说明:

  1. vtkOpenGLRenderWindow::SetGlobalMaximumNumberOfMultiSamples(8) 控制全局最大多重采样数,改善抗锯齿效果。
  2. QSurfaceFormat::setDefaultFormat(QVTKOpenGLWidget::defaultFormat()) 为 QVTKOpenGLWidget 设置默认的颜色缓冲、深度缓冲和多重采样参数。
  3. 这样初始化后,QVTKOpenGLWidget 可以正常显示带颜色缓冲的渲染内容,而不需要额外手动创建 RenderWindow。

2 主动 Render 防止窗口全黑

在 Windows 系统 下,使用 VTK 和 Qt 集成时,有时会遇到 QVTKOpenGLWidget 或 vtkRenderWindow 显示全黑的情况。

原因是 VTK 9 的渲染管线中,vtkRenderWindowInteractor::Start() 并不总是会触发首次渲染,尤其是在 OpenGL 上下文还未完全初始化的情况下。

在启动交互器之前,主动调用 vtkRenderWindow::Render(),确保渲染上下文初始化并绘制第一帧:

// old
    vtkNew<vtkRenderWindow> renwin ;
    renwin->AddRenderer(renderer);
    renwin->SetSize(800, 800);
    vtkNew<vtkInteractorStyleTrackballCamera>style ;
    vtkNew<vtkRenderWindowInteractor> rendererwindowinteracrot ;
    rendererwindowinteracrot->SetInteractorStyle(style);
    rendererwindowinteracrot->SetRenderWindow(renwin);
    rendererwindowinteracrot->Start();
// new
    vtkNew<vtkRenderWindow> renwin ;
    renwin->AddRenderer(renderer);
    renwin->SetSize(800, 800);
    renwin->Render();
    vtkNew<vtkRenderWindowInteractor> rendererwindowinteracrot ;
    rendererwindowinteracrot->SetRenderWindow(renwin);
    rendererwindowinteracrot->Start();