Horde3D 粒子系统不在 Qt OpenGL 中渲染

Posted

技术标签:

【中文标题】Horde3D 粒子系统不在 Qt OpenGL 中渲染【英文标题】:Horde3D Particle System not rendering in Qt OpenGL 【发布时间】:2011-12-21 18:48:50 【问题描述】:

Horde3d 带有 2 个样本,使用 GLFW 编译。其中一位,Knight,展示了一个粒子发射器。我已将示例移植到 Qt,我编写了一个薄层,使应用代码(即场景设置、渲染和事件处理)保持不变

确实,功能还可以,只是粒子发射器不显示。我在 GLFW 初始化中看不到任何具体内容,我尝试了在 Qt 中找到的一些设置,但没有成功。 Horde3d 负责 OpenGL 接口,并公开更高级别的、干净的 C 接口。有什么线索吗?

编辑:qtKnight.pro 的最相关来源

这里(清理:) main.cpp

#include "glwidget.h"
#include <QApplication>

int main(int argc, char* argv[]) 
    QApplication app(argc, argv);
    GLWidget glw;
    glw.show();
    return app.exec();

这里是 glWidget.h

#ifndef GL_WIDGET_H
#define GL_WIDGET_H

#include <QtOpenGL>
#include <QTimer>
#include <QKeyEvent>
#include <Horde3D.h>
#include <Horde3DUtils.h>
#include <sstream>
#include <app.h>

class GLWidget : public QGLWidget, Application 
    Q_OBJECT

public:

    GLWidget();
    ~GLWidget();

    QSize minimumSizeHint() const  return sizeHint(); 
    QSize sizeHint() const  return QSize(640, 480); 

protected:

    void initializeGL();
    void paintGL();
    void resizeGL(int width, int height);

    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);

    void keyPressEvent(QKeyEvent *e)  keyEvent(e, true); QGLWidget::keyPressEvent(e); 
    void keyReleaseEvent(QKeyEvent *e)  keyEvent(e, false); QGLWidget::keyReleaseEvent(e); 
    void keyEvent(QKeyEvent *, bool);

public slots:

    void appLoop()  updateGL(); 

private:

    QPoint lastPos;
    QTimer evloop;
;

#endif

这里是 glWidget.cpp

#include "glwidget.h"
#include <stdexcept>
#include <QtDebug>
#include <QTextStream>
#include <QGLFormat>

GLWidget::GLWidget() :
    QGLWidget(QGLFormat(QGL::AlphaChannel | QGL::SampleBuffers)),
    Application("/home/carlo/horde3d/SDK_1.0.0_Beta5/Horde3D/Binaries/Content")

    connect(&evloop, SIGNAL(timeout()), this, SLOT(appLoop()));
    evloop.start(0);


GLWidget::~GLWidget()

    h3dutDumpMessages();
    h3dRelease();


void GLWidget::initializeGL()

    if (!init())
        throw std::runtime_error("Could not initialize renderer");


void GLWidget::paintGL()

    keyStateHandler();
    mainLoop(30);


void GLWidget::resizeGL(int width, int height)

    Application::resize(width, height);


void GLWidget::mousePressEvent(QMouseEvent *event)

    lastPos = event->pos();


void GLWidget::mouseMoveEvent(QMouseEvent *event)

    QPoint cPos = event->pos();
    float dX = cPos.x() - lastPos.x(); //event->x() - lastPos.x();
    float dY = cPos.y() - lastPos.y(); //event->y() - lastPos.y();
    Application::mouseMoveEvent(dX, dY);
    lastPos = cPos;


void GLWidget::mouseReleaseEvent(QMouseEvent * /* event */)



void GLWidget::keyEvent(QKeyEvent *k, bool on_off)

#define setK(X,Y)   case Qt::X: setKeyState(Y, on_off); break;
#define setF(X)     case Qt::Key_##X: setKeyState(X, on_off); break;
#define R(X, Y)     (v >= #X[0] && v <= #Y[0])

    int v = k->key();
    switch (v) 
    case Qt::Key_F1: if (on_off) showFullScreen(); break;
    case Qt::Key_F2: if (on_off) showNormal(); break;
    setF(F3)
    setF(F6)
    setF(F7)
    setF(F8)
    setK(Key_Space, SP)
    default:
     if (R(A, Z) || R(0, 9))
      setKeyState(v, on_off);
    

【问题讨论】:

也许您可以使用 Qt 而不是 GLFW 发布更改后的示例?它不应该那么多,因为大部分工作都是由 Horde3d 完成的。 克里斯蒂安,感谢您的帮助。我在这里上传了forzadinerzia.it/index.php?n=Main.Horde3dTest 文件。在页面上我发表了一些评论。 实际上最好将代码发布在问题中(使用 *** 的代码格式化功能),而不是在一些非持久链接网站上,一旦问题得到解答,您可能会将其删除。如果它有点多,请不要害怕。如果您直接从 Horde3d 示例中获取app.h/cpp,则只需发布mainglwidget.h/cpp,这并不多。 好的,我把代码贴在这里 为什么使用QGL::SampleBuffers 格式标志?请记住,Horde3d 在 HDR 管道中使用自己的多重采样缓冲区,这也可能会干扰被多重采样的显示缓冲区(不确定)? 【参考方案1】:

既然你说它只是没有显示的粒子,它可能与 alpha 混合有关。我还从您的代码中看到,您在构造 QGLWidget 时没有指定格式,在这种情况下使用了 default format,它显式禁用了 alpha 通道。

虽然我不知道这是否有任何影响(RGBA 中不应该总是有一个 A 吗?),但也许这确实需要一个像素格式,其中没有 A 通道的存储,在这种情况下事情像 alpha 混合(用于透明粒子)不起作用。

因此,只需尝试在 QGLWidget 构造函数中使用适当的格式来显式请求它:

GLWidget::GLWidget()
    : QGLWidget(QGLFormat(QGL::AlphaChannel))

实际上,您的 QGLFormat 参数被注释掉了,但它与 HasOverlay 选项没有任何关系,您并不真正需要它,因为 Horde3d 会自己进行叠加渲染。

【讨论】:

我尝试了所有可用的格式,检查了源代码和文档中的默认值,HasOverlays 它位于列表底部(附近)。无论如何,我已经重试了,没有运气......

以上是关于Horde3D 粒子系统不在 Qt OpenGL 中渲染的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL--粒子系统

OpenGL ES 2.0——简单粒子系统的最佳路径

OpenGL VBO 绘图问题

粒子系统:粒子生成

opengl 用粒子建模火箭火焰和蒸汽轨迹

在 openGL 中渲染粒子的问题