【发布时间】: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 文件。在页面上我发表了一些评论。
-
实际上最好将代码发布在问题中(使用 StackOverflow 的代码格式化功能),而不是在一些非持久链接网站上,一旦问题得到解答,您可能会将其删除。如果它有点多,请不要害怕。如果您直接从 Horde3d 示例中获取
app.h/cpp,则只需发布main和glwidget.h/cpp,这并不多。 -
好的,我把代码贴在这里
-
为什么使用
QGL::SampleBuffers格式标志?请记住,Horde3d 在 HDR 管道中使用自己的多重采样缓冲区,这也可能会干扰被多重采样的显示缓冲区(不确定)?