crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> OpenGL4.3 в Qt5.1 - подключение функций
wf778899
  опции профиля:
сообщение 12.3.2015, 0:05
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 20.7.2014
Пользователь №: 4191

Спасибо сказали: 0 раз(а)




Репутация:   0  


Привет всем.
Решил разобраться с OpenGL на QT. У меня Qt5.1, Windows7x64. Копаться в старом GL (который без шейдеров) смысла больше не вижу. Как я понял, в QTе для всех функций, начиная с OpenGL 1.1, надо прописывать точки входа. Стал читать, как это делается. Как я понял - с помощью классов формата и контекста. Толком так ничего и не получилось. Короче, что я сделал (код ниже):
#include "Scene.h"
#include <QGLWidget>
#include <QtOpenGL>
#include <QGLFormat>
#include <QGLContext>
#include <QOpenGLContext>
#include <QOpenGLFunctions_4_3_Core>
#include <QGLFunctions>

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

Widget::~Widget(){}

void Widget::initializeGL(){
    glClearColor(1.0, 1.0, 1.0, 1.0);
}

void Widget::resizeGL(int w, int h){
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
    glViewport(0, 0, (GLint)w, (GLint)h);
}

void Widget::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    QGLFormat format;
    format.setVersion(4, 3);
    QGLContext cont(format);
    cont.create();
    cont.makeCurrent();
    QOpenGLFunctions_4_3_Core *m_funcs;
    m_funcs = cont.functions();
    m_funcs->glCreateShader(GL_VERTEX_SHADER);
}


Простой класс, который ничего не делает (только окно выводит). В его рисовальщике я создал формат, которому прописал только одну настройку - использовать OpenGL4.3 (проверял, поддерживается). Потом этот формат я задаю контексту и делаю его текущим. Потом получаю объект функций QOpenGLFunctions_4_3_Core и назначаю ему все точки входа. Вот здесь (m_funcs = cont.functions() компилятор встаёт на дыбы и пишет "cannot convert 'QGLFunctions*' to 'QOpenGLFunctions_4_3_Core*' in assignment". Понятно, что типы не стыкуются. Объясните, пожалуйста, как правильно назначать точки входа - как я успел понять, без этого OpenGL теряет смысл...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 12.3.2015, 1:37
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


http://doc.qt.io/qt-5/qopenglcontext.html#versionFunctions

То что вы используете, возвращает только для GL ES 2

В paintGL происходит перерисовка, там не нужно каждый раз создавать контекст.
Все как то в кучу свалено, почитайте например http://doc.qt.io/qt-5/qtgui-openglwindow-example.html

Сообщение отредактировал lanz - 12.3.2015, 1:43
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wf778899
  опции профиля:
сообщение 12.3.2015, 22:00
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 20.7.2014
Пользователь №: 4191

Спасибо сказали: 0 раз(а)




Репутация:   0  


Прочитал <QOpenGLContext> и <QSurfaceFormat>. lanz, вот что у меня получилось. Даже запускается. Посмотрите, пожалуйста, правильно я всё сделал? Проверить просто больше не кому :)

#include "mainwindow.h"
#include <QOpenGLContext>
#include <QSurfaceFormat>
#include <QOpenGLFunctions_4_3_Core>
#include "qdebug.h"

MainWindow::MainWindow(QScreen *parent) : QWindow(parent) {
    setSurfaceType(OpenGLSurface);                    //Устанавливаем тип поверхности
    QSurfaceFormat form;                                    //Создаём формат
    form.setMajorVersion(4);                                //Указываем версию GL, которую хотим юзать
    form.setMinorVersion(3);
    form.setProfile(QSurfaceFormat::CoreProfile);  //Профиль GL без устаревших функций
    setFormat(form);
    create();
    QOpenGLContext *cont = new QOpenGLContext;     //Объявляем контекст
    cont->setFormat(form);                                         //Задаём контексту формат, создаём контекст

    if(cont->create())
        qDebug() << "Контекст создан успешно!";         //Проверяем
    if(cont->isValid())
        qDebug() << "Контекст валиден";
    if(cont->makeCurrent(this))
        qDebug() << "Контекст cont - текущий";
    
    funcs43 = 0;    //Объявлена в хедере класса
    funcs43 = cont->versionFunctions<QOpenGLFunctions_4_3_Core>();  //Задаём точки входа
    if(funcs43)
        qDebug() << "Функции доступны";
    if(funcs43->initializeOpenGLFunctions())
        qDebug() << "Функции инициализированы";
}

MainWindow::~MainWindow(){}

void MainWindow::initializeGL(){
    glClearColor(1.0, 1.0, 1.0, 1.0);
}

void MainWindow::resizeGL(int w, int h){
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
    glViewport(0, 0, (GLint)w, (GLint)h);
}

void MainWindow::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    funcs43->glCreateShader(GL_VERTEX_SHADER);                 //Пробуем что-нибудь
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 13.3.2015, 15:03
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Шейдеры тоже не надо перекомпилировать каждый кадр. А так чего проверять, нарисуйте треугольник и сами все увидите.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.11.2024, 0:22