2011-12-21 2 views
2

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); 
    } 
} 
+0

아마도 GLFW 대신 Qt로 변경된 예제를 게시 할 수 있습니까? 어쨌든 대부분의 작업이 Horde3d에 의해 이루어지기 때문에 그렇게 많이는 안됩니다. –

+0

기독교인, 도와 줘서 고마워. 여기에 http://www.forzadinerzia.it/index.php?n=Main.Horde3d 파일을 업로드했습니다. 페이지에서 나는 약간의 논평을했다. – CapelliC

+0

실제로 질문에 답을 얻었을 때 제거 할 가능성이있는 일부 비 영구 링크 된 사이트보다 (StackOverflow의 코드 서식 기능을 사용하여) 코드 안에 코드를 게시하는 것이 좋습니다. 조금이라도 두려워하지 마라. Horde3d 예제에서 직접'app.h/cpp'를 가져왔다면'main'과'glwidget.h/cpp'를 게시하면됩니다. –

답변

2

표시되지 않은 입자 만 있다고 했으므로 알파 블렌딩과 관련 될 수 있습니다. 또한 귀하의 코드에서 QGLWidget을 구성 할 때 형식을 지정하지 않았 음을 알 수 있습니다.이 경우 명시 적으로 알파 채널을 비활성화하는 default format이 사용됩니다.

이것이 어떤 영향을 미치는지는 모르겠지만 (RGBA에 항상 A가 없어야합니까?) A 채널에 대한 저장 공간이없는 픽셀 형식을 요청할 수 있습니다. 알파 블렌딩 (투명 입자에 ​​사용)과 같은 것들은 작동하지 않습니다.

그래서 그냥 QGLWidget 생성자에서 적절한 형식을 사용하여 명시 적으로 요청하려고 :

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

당신은 실제로 당신의 outcommented QGLFormat 인수를 사용하여 궤도에 있었다,하지만 함께 할 수없는 것도있다 Horde3d는 자체 오버레이 렌더링을하므로 실제로 필요하지 않은 HasOverlay 옵션이 있습니다.

+0

나는 원본과 문서에서 기본값을 확인하면서 사용 가능한 모든 형식을 시도했다. HasOverlays는 목록의 맨 아래에있다. 어쨌든, 나는 재 시도했다, 행운을 빌어 요 .... – CapelliC

관련 문제