Nano Hash - криптовалюты, майнинг, программирование

Поддерживает ли QtQuick 2 glBindBuffer?

кажется, я не могу использовать glBindBuffer, glGenBuffer в унаследованном классе QQuickPaintedItem.

Я уже пытаюсь включить , но это не работает, и я также пытаюсь использовать GLEW в QQuickPaintedItem. Похоже, что Qt не определил бы эти функции в QQuickPaintedItem.

Моя версия Qt — 5.1 msvc-opengl, и система работает на рабочем столе win7.

сообщение компилятора:

fcglpanel.cpp(254): error C3861: 'glBindBuffer': identifier not found

какой-то код

class MyQuickGLPanel :public QQuickPaintedItem 
{

Q_OBJECT

    //-------------------------------------------------------------------------
    public: 
        FCGLPanel(QQuickItem  * parent=0);
        ~FCGLPanel(); 
        virtual void paint(QPainter * painter);
    ...
}

главный

int main(int argc, char *argv[])
{
    QApplication app(argc, argv); 

    qmlRegisterType<MyQucikGLPanel>("MyQucikGLPanel", 1, 0, "MyPanel"); 

    QQmlApplicationEngine engine(QUrl::fromLocalFile("../qml/main.qml")); 

    QObject *topLevel = engine.rootObjects().value(0);
    QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
    return qmlMode(argc, argv);
}

main.qml

import QtQuick 2.1
import QtQuick.Controls 1.0 
import QtQuick.Layouts 1.0
import QtQuick.Dialogs 1.0
import QtQuick.Window 2.1

import "./MyUI" 1.0 as MyUI
import MyQucikGLPanel 1.0

ApplicationWindow {
    id: appwindow

    property int zGLPanel : 4;

    SplitView {

        x: 32
        y: 8
        anchors.rightMargin: 5
        anchors.bottomMargin: 5
        anchors.leftMargin: 0
        anchors.topMargin: 0
        anchors.fill: parent

        // [EMBEDDING C++ object]
        MyPanel{
            id: mylogicPanel
            anchors.fill: parent
            width: 640
            height: 480
            z : appwindow.zGLPanel
        }
    }           
}

ОБНОВЛЕНИЕ

Перечислите способ избежать этой проблемы на платформе Windows.

  1. Получите точку входа OpenGL через

    QOpenGLFunctions* oglEntry = window()->openglContext()->functions();

  2. Используйте настраиваемое создание контекста в вашем QWindow.

    
    Window::Window( QScreen* screen )
    : QWindow( screen ){
    // Tell Qt we will use OpenGL for this window
    setSurfaceType( OpenGLSurface );
    
    // Specify the format and create platform-specific surface
    QSurfaceFormat format; 
    format.setMajorVersion( 4 );
    format.setMinorVersion( 3 ); 
    format.setProfile( QSurfaceFormat::CoreProfile );
    setFormat( format );
    create();
    
    // Create an OpenGL context
    m_context = new QOpenGLContext;
    m_context->setFormat( format );
    m_context->create();
      ....
    }
    

    ССЫЛКА

    http://www.kdab.com/opengl-in-qt-5-1-part-1/

    Разница в скорости opengl между Qt 4/5 и API Opengl


  • Предполагается, что QQuickPaintedItem рисуется с помощью QPainter. Для чего вы используете glBindBuffer? 15.04.2014
  • Я использую какой-то смешанный рисунок OpenGL, который можно сделать, соединив сигнал до рендеринга и после рендеринга. (поэтому у меня есть еще одна функция трехмерного рисования.) Идея состоит в том, чтобы использовать сценарии пользовательского интерфейса QtQuick, а также поддерживать некоторые требования к трехмерному рендерингу. 15.04.2014

Ответы:


1

Qt пытается упаковать множество функций OpenGL в один класс, содержащий все (расширенные) общие функции между GL и GL ES 2.0, называемые QGLFunctions.

Вместо использования GLEW вам следует рассмотреть QGLFunctions::glBindBuffer (...). Если вы вызываете QGLFunctions::initializeGLFunctions (...), он выполняет множество тех же вещей, что и GLEW.

На самом деле вы, вероятно, унаследуете этот класс, чтобы любой вызов glBindBuffer (...) автоматически обрабатывался посредством наследования QGLFunctions.


Следующее описание взято из документации Qt SDK для QGLFunctions:

QGLFunctions предоставляет гарантированный API, доступный во всех системах OpenGL, и обеспечивает разрешение функций в тех системах, где это необходимо. Рекомендуемый способ использования QGLFunctions — прямое наследование:

class MyGLWidget : public QGLWidget, protected QGLFunctions
{
  Q_OBJECT
public:
  MyGLWidget(QWidget *parent = 0) : QGLWidget(parent) {}

protected:
  void initializeGL();
  void paintGL();
};

void MyGLWidget::initializeGL()
{
  initializeGLFunctions();
}
11.04.2014
  • Спасибо, Андон. Этот метод работает для QWidget, но я работаю над приложением на основе QtQuick. Наследование QGLFunctions в настроенном QQuickPaintedItem вызовет утверждение. Я предполагаю, что это потому, что все QQuickWindow использует один и тот же контекст OGL. 12.04.2014
  • @tirth - нет ничего плохого в заимствовании контекста. Вы можете выполнять пользовательскую прорисовку GL как под, так и над QtQuick, зайдите на YouTube и посмотрите это видео об интеграции QML и GL: youtube.com/watch?v=GYa5DLV6ADQ 12.04.2014
  • @tirth: это был только пример из документации, вы можете инициализировать экземпляр этого класса из любого места. Вам не нужно наследовать его каким-либо классом, который наследует QGLWidget, другой вариант использования — создать объект QGLFunctions из любого контекста OpenGL, а затем квалифицировать все ваши вызовы GL как gl_functions.glBindBuffer (...). На некоторых платформах функции расширения GL специфичны для контекста, поэтому вам может понадобиться активный контекст в вызывающем потоке, прежде чем вы сможете это сделать — GLX немного странный, поскольку вы можете законно загружать указатели функций без контекста. 12.04.2014
  • @tirth: Иными словами, на такой платформе, как Windows, ваш экземпляр QGLFunctions можно безопасно использовать только с контекстом OpenGL, который был активен при его инициализации. В Linux вы можете инициализировать его и использовать в любом контексте. Поскольку это Qt, и вы должны сосредоточиться на переносимости, вы должны удовлетворить более строгие требования Windows (WGL), а не Linux (GLX). 12.04.2014
  • Этот ответ почти готов: вы не можете просто использовать glBindBuffer, так как это не вызов GL 1.1 (вы работаете в Windows!). Вы должны разрешить это во время выполнения. 1) Не используйте QGLFunctions, вместо этого используйте QOpenGLFunctions (через QOpenGLContext::functions или подобное), см. здесь по некоторым причинам. В этом случае у вас есть приложение QQ2, а не приложение на основе виджетов, и вы не хотите использовать QtOpenGL. 2) Рассмотрите возможность использования QOpenGLBuffer только для обертывания ваших буферных объектов. 15.04.2014
  • Весь смысл QGLFunctions в том, чтобы загружать необходимые функции из частей OpenGL API, которые требуют расширения во время выполнения на некоторых платформах. Предполагается, что вызов его метода init позаботится о разрешении точки входа для всех функций, более новых, чем GL 1.1 (Windows). 15.04.2014
  • И это то, что я только что сказал. Но вместо этого вы по-прежнему должны использовать QOpenGLFunctions. Недостатки использования QGLFunctions включают: 1) QGLFunctions требует QtOpenGL, который, в свою очередь, требует QtWidgets. Это дополнительные 15-25 МБ ненужных библиотек, если ваше приложение только QQ2. 2) API-интерфейсы QQ2 написаны с использованием типов QOpenGL*, живущих в QtGui. Нет причин проходить через QGL*. 3) QtOpenGL готов, и типы QGL* не получат исправлений и улучшений функций. Типы QOpenGL* будут. 15.04.2014
  • спасибо @peppe. Это решает мой вопрос о различном интерфейсе между QGL и QOpenGL. 15.04.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..