QVector3D und OpenGL: Float vs Double



  • Hallo an alle,

    ich möchte eine Qt/OpenGL-Anwendung schreiben. Ich habe noch nicht so viel Erfahrung mit beidem und beisse mich dementsprechend durch verschiedene Tuts
    und Beispiele...

    Das Beispiel, auf dass ich mein Hauptaugenmerk gelegt habe, befindet sich hier:

    http://doc.qt.nokia.com/4.7/opengl-hellogl.html

    bzw. fehlt da noch das zu zeichnende Objekt, da befinden sich source und header
    hier:

    http://qt.gitorious.org/qt-labs/nacl/trees/11fed1f64f43593a2890e0a3f27b4e2e7ebde783/examples/opengl/shared

    Auf den Inhalt der QT-Logo class zielt auch meine Frage ab...

    In "qt_logo.cpp" gibt es ein Hilfs-struct "Geometry" wie folgt:

    53 struct Geometry
    54 {
    55 	QVector<GLushort> faces;
    56	QVector<QVector3D> vertices;
    57  	QVector<QVector3D> normals;
    58 	void appendSmooth(const QVector3D &a, const QVector3D &n, int from);
    59 	void appendFaceted(const QVector3D &a, const QVector3D &n);
    60 	void finalize();
    61 	void loadArrays() const;
    62 };
    

    und insbesondere die Funktion loadArrays

    97  void Geometry::loadArrays() const
    98  {
    99  	glVertexPointer(3, GL_FLOAT, 0, vertices.constData());
    100  	glNormalPointer(GL_FLOAT, 0, normals.constData());
    101 }
    

    Das sind nach meinem Verständnis die arrays, auf dessen Basis
    nachher gezeichnet wird. Nun sind aber die member vertices und normals
    QT-Objekte der Klasse QVector3D. Ich kann zwar in die Klasse nicht reinschauen,
    aber es wird dort immer qreal zurückgegeben, ich gehe irgendwie davon aus,
    dass dann auch qreal drin ist. Und da ich weiterhin annehme, dass
    mein Lappi kein ARM-Rechner ist 😉 , erwarte ich den Typ "double" für qreal.
    Dennoch wird den beiden gl-Funktionen in loadArrays der Typ-Hinweis GL_FLOAT
    mitgegeben. Das klappt zwar, aber warum klappt das oder was habe ich übersehen?

    Danke
    Rahul



  • Die QVector3D Klasse enthält 3 float's. -> qvector3d.h

    class QVector3D {
      // allerlei Methoden 
    private: 
      float xp, yp, zp;
    }
    

    D.h. das constData() liefert die Adresse auf das erste Member float xp des ersten QVector3D
    Der QVector hat in seinem Datenfeld im Prinzip folgendes

    float x1p, y1p, z1p;
      float x2p, y2p, z2p;
      float x3p, y3p, z3p;
      ...
    

    Genau das, was glVertexPointer , glNormalPointer erwartet.



  • Hmm, ja danke für die Antwort,
    ist das denn Usus, die Genauigkeit
    an dieser Stelle zu verkürzen(von double/qreal nach float)?



  • Rahul0891 schrieb:

    Hmm, ja danke für die Antwort,
    ist das denn Usus, die Genauigkeit
    an dieser Stelle zu verkürzen(von double/qreal nach float)?

    Glaub nicht, dass dies bei Grafikberechnungen eine Rolle spielt. Ein Pixel hin- oder her juckt nicht. Vor allem ältere System haben da eher einen Performancevorteil.


Anmelden zum Antworten