Система частиц Horde3D не отображается в Qt OpenGL - PullRequest
2 голосов
/ 21 декабря 2011

Horde3d поставляется с 2 сэмплами, скомпилированными с GLFW. Один из них, Найт, показывает излучатель частиц. Я портировал образцы в Qt, используя тонкий слой, который я написал, что оставляет неизменным аппликативный код (т.е. настройка сцены, рендеринг и обработка событий).

Действительно, функциональность в порядке, за исключением того, что излучатель частиц не показывает. Я не вижу ничего конкретного в инициализации GLFW, и я попробовал некоторые настройки, найденные в Qt, но безуспешно. Horde3d заботится об интерфейсе OpenGL и предоставляет чистый, чистый C-интерфейс. Любая подсказка?

РЕДАКТИРОВАТЬ: Большинство Rilevant Источники 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);
    }
}

1 Ответ

2 голосов
/ 22 декабря 2011

Поскольку вы говорите, что не показаны только частицы, это может быть связано с альфа-смешиванием. Я также видел из вашего кода, что вы не указываете формат при создании QGLWidget, и в этом случае используется формат по умолчанию , который явно отключает альфа-канал.

Хотя я не знаю, имеет ли это какой-либо эффект (не должно ли всегда быть A в RGBA?), Но, возможно, это действительно запрашивает формат пикселей, где нет места для канала A, и в этом случае как альфа-смешение (используется для прозрачных частиц) не будет работать.

Так что просто попробуйте запросить его явно, используя соответствующий формат в конструкторе QGLWidget:

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

Вы действительно были на правильном пути со своим аргументом QGLFormat, закомментированным, но это не имеет ничего общего с опцией HasOverlay, которая вам на самом деле не нужна, так как Horde3d выполняет собственный оверлейный рендеринг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...