Horde3d에는 GLFW로 컴파일 된 두 개의 샘플이 제공됩니다. 그들 중 하나 인 Knight는 입자 이미 터를 보여줍니다. 나는 샘플을 Qt로 포팅했으며, 쓴 레이어를 으로 변경하지 않고 코드 (예 : 장면 설정, 렌더링 및 이벤트 처리)를 변경하지 않았습니다.Horde3D 입자 시스템이 Qt OpenGL에서 렌더링되지 않음
실제로 입자 이미 터가 표시되지 않는다면 기능이 정상입니다. 나는 GLFW 초기화에서 특별한 것을 볼 수 없으며 Qt에서 발견 한 몇 가지 설정을 성공없이 시도했다. Horde3d는 OpenGL 인터페이스를 처리하고 더 높은 수준의 깨끗한 C 인터페이스를 제공합니다. 어떤 단서?
편집 : 여기 qtKnight.pro 대부분의 Rilevant 소스
(청소 : MAIN.CPP 여기 glWidget.h
#include "glwidget.h"
#include <QApplication>
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
GLWidget glw;
glw.show();
return app.exec();
}
#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);
}
}
아마도 GLFW 대신 Qt로 변경된 예제를 게시 할 수 있습니까? 어쨌든 대부분의 작업이 Horde3d에 의해 이루어지기 때문에 그렇게 많이는 안됩니다. –
기독교인, 도와 줘서 고마워. 여기에 http://www.forzadinerzia.it/index.php?n=Main.Horde3d 파일을 업로드했습니다. 페이지에서 나는 약간의 논평을했다. – CapelliC
실제로 질문에 답을 얻었을 때 제거 할 가능성이있는 일부 비 영구 링크 된 사이트보다 (StackOverflow의 코드 서식 기능을 사용하여) 코드 안에 코드를 게시하는 것이 좋습니다. 조금이라도 두려워하지 마라. Horde3d 예제에서 직접'app.h/cpp'를 가져왔다면'main'과'glwidget.h/cpp'를 게시하면됩니다. –