QtQuick 2 supporta glBindBuffer?
-
21-12-2019 - |
Domanda
sembra che non sia possibile utilizzare glBindBuffer, glGenBuffer nella classe ereditata di QQuickPaintedItem.
Ho già provato a includere , ma non funziona e provo anche a utilizzare GLEW in QQuickPaintedItem.Sembra che Qt non definirebbe quelle funzioni in QQuickPaintedItem.
La mia versione di Qt è 5.1 msvc-opengl e il sistema funziona su desktop Win7.
messaggio del compilatore:
fcglpanel.cpp(254): error C3861: 'glBindBuffer': identifier not found
qualche codice
class MyQuickGLPanel :public QQuickPaintedItem
{
Q_OBJECT
//-------------------------------------------------------------------------
public:
FCGLPanel(QQuickItem * parent=0);
~FCGLPanel();
virtual void paint(QPainter * painter);
...
}
principale
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
}
}
}
AGGIORNAMENTO
Elenca alcuni modi per evitare questo problema nella piattaforma Windows.
Recupera il punto di ingresso di OpenGL tramite
QOpenGLFunctions* oglEntry = window()->openglContext()->functions();
Utilizza la creazione di contesti personalizzati nella tua 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(); .... }
RIF
Soluzione
Qt tenta di racchiudere molte funzionalità OpenGL in un'unica classe che contiene tutte le funzioni condivise (estese) tra GL e GL ES 2.0, chiamate QGLFunctions
.
Piuttosto che usare GLEW, dovresti considerare QGLFunctions::glBindBuffer (...)
.Se chiami QGLFunctions::initializeGLFunctions (...)
fa a quantità delle stesse cose di GLEW.
In effetti, probabilmente andresti avanti ed erediteresti questa classe in modo che qualsiasi chiamata a glBindBuffer (...)
viene gestito automaticamente tramite l'ereditarietà di QGLFunctions
.
La seguente descrizione è tratta dalla documentazione dell'SDK Qt per QGLFunctions
:
QGLFunzioni fornisce un garantita API disponibile su tutti i sistemi OpenGL e che si occupa della risoluzione delle funzioni sui sistemi che ne hanno bisogno.Il modo consigliato per utilizzare QGLFunctions è tramite ereditarietà diretta:
class MyGLWidget : public QGLWidget, protected QGLFunctions
{
Q_OBJECT
public:
MyGLWidget(QWidget *parent = 0) : QGLWidget(parent) {}
protected:
void initializeGL();
void paintGL();
};
void MyGLWidget::initializeGL()
{
initializeGLFunctions();
}