ПрограммированиеФорумГрафика

QGLContext не инициализируется

Страницы: 1 2 Следующая »
#0
21:14, 27 ноя 2011

Попробовал сделать то же, что в недавней статье, но с 3 openGL.
oglwindow.cpp:

#include "oglwindow.h"

OGLWindow::OGLWindow(QWidget *parent) :
    QGLWidget(parent)
{
}
void OGLWindow::initializeGL()
{
    QGLFormat fm;
    fm.setAlpha(true);
    fm.setDoubleBuffer(true);
    fm.setProfile(QGLFormat::CoreProfile);
    fm.setVersion(3,3);
    fm.setSampleBuffers(true);
    fm.setAccum(true);
    fm.setDepth(true);
    fm.setDirectRendering(true);
    QGLContext *con = new QGLContext(fm);
    con->create();
    con->makeCurrent();
}
void OGLWindow::keyPressEvent(QKeyEvent *key)
{

}
void OGLWindow::resizeGL(int w, int h)
{

}
void OGLWindow::paintGL()
{

}

oglwindow.h:

#ifndef OGLWINDOW_H
#define OGLWINDOW_H
#include <QMainWindow>
#include <QKeyEvent>
#include <QtOpenGL>

class OGLWindow : public QGLWidget
{
    Q_OBJECT

public:
    OGLWindow(QWidget *parent = 0);
    void keyPressEvent(QKeyEvent *key);
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();

private slots:

private:

};
#endif // OGLWINDOW_H

main.cpp:

#include <QtGui/QApplication>
#include "oglwindow.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    OGLWindow w;
    w.show();

    return a.exec();
}

При каждом запуске выводится сообщение "QGLContext::makeCurrent(): Cannot make invalid context current". Понятно, что причин м.б. вагон и маленькая тележка, но до того с SDL нормально работало. Здесь показалось, что сделано проще, но, видимо, что-то забыл сделать. Формат пробовал полностью оставлять пустым, но ничего не менялось

#1
22:10, 27 ноя 2011

Q.S.
1) твоя версия Qt точно корректно держит OpenGL 3.3?
2) Пробовал продебажить зайдя в иcходный код Qt ?
если с SDL работает, то либо виновато Qt, либо его неправильное использование тобой.

#2
23:40, 27 ноя 2011

Andrey
1)4.7.4, вроде как раз функции работы с контекстом нормальные добавили. Правда, в документации полного примера не нашел, только куски.
2)пробовал, но функция create вообще как виртуальная объявлена - дебаггер себя совершенно одинаково ведет и при step into, и при step over. Единственное что, м.б. там в конструкторе нужно вручную указать нужное QPaintDevice, но как его получить, я вообще не представляю. Да и этот параметр является необязательным.

#3
23:59, 27 ноя 2011

а в конструкторе setFormat не ?

#4
0:11, 28 ноя 2011

Blew_zc
в смысле? Он и так передается же. Или нужно еще дополнительно после него setFormat? Попробовал, не помогает.

Забавно, что проверка на ненулевость устройства не проходится:

QGLContext *con = new QGLContext(fm);
    con->setFormat(fm);
    con->create();
    if(con->device()!=0)
    con->makeCurrent();
#5
0:36, 28 ноя 2011

а setDefaultFormat не устраивает?

#6
0:47, 28 ноя 2011

Blew_zc
format.setDefaultFormat(с обязательным аргументом format) устанавливает, какой формат считать дефолтным для новых контекстов. При чем здесь это?

Я пробовал ничего не менять в формате, получалось то же самое

#7
0:53, 28 ноя 2011

Q.S.
пля. тебе не нужно контекст пересоздавать.

main.cpp:

#include <QtGui/QApplication>
#include <QGLFormat>
#include "oglwindow.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QGLFormat fm;
    fm.setAlpha(true);
    fm.setDoubleBuffer(true);
    fm.setProfile(QGLFormat::CoreProfile);
    fm.setVersion(3,3);
    fm.setSampleBuffers(true);
    fm.setAccum(true);
    fm.setDepth(true);
    fm.setDirectRendering(true);
    QGLFormat::setDefaultFormat (fm);

    OGLWindow w;
    w.show();

    return a.exec();
}


oglwindow.cpp:

OGLWindow::OGLWindow(QWidget *parent) :
    QGLWidget(parent)
{
}

void OGLWindow::initializeGL()
{
ничего не делаем с контекстом. просто вызываем функции огл. это уже 3.3 контекст
}
#8
1:31, 28 ноя 2011

в QT 4.8 будет OpenGL 3x (Core Profile).
Ссыль.

#9
4:07, 28 ноя 2011

NewmanMDB
Он уже там есть.
Q.S.

QGLFormat fmt;
fmt.setVersion(3, 3);
fmt.setProfile(QGLFormat::CoreProfile);
fmt.setDoubleBuffer(true);

setFormat(fmt);
#10
7:36, 28 ноя 2011

А, спасибо. Меня сбило с толку наличие этих функций. Зачем они тогда нужны? При использовании нескольких буферов для вывода?

#11
12:23, 28 ноя 2011

Ответ по первоначальному вопросу. В инициализации рендеринга создается контекст - это ошибка. Контекст нужно создавать либо в конструкторе класса, либо за пределами класса и передавать в объект. Удачи!

#12
17:20, 28 ноя 2011

Проще делать ручками да и всё, только хэндл qt окна передавать к нативному огл.

#13
18:02, 28 ноя 2011

_vasa_
А окно кто будет пересоздавать? Да ну нафик. Написал 2 строчки и готово.

#14
18:29, 28 ноя 2011

Blew_zc
> А окно кто будет пересоздавать
В child

Да можно и создать, там разве долго?

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.