Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Übergabe von Pointer ( auf Struktur ) -> Zugriff auf Funktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.01.2016, 13:50 Uhr
Lehrerkind



Hallo alle Zusammen!

Ich versuche mich momentan an OpenGl mit c++. Ich habe selber nur sehr wenig Erfahrung mit c++ und OpenGl gemacht. Mein Problem liegt hier aber nicht bei der Benutzung von OpenGl sondern bei c++ selber, weswegen ich das ganze hier und nicht im Bereich OpenGL poste, ich hoffe damit liege ich richtig...

Aktueller Stand:
Ich habe momentan ein IndexBufferObjekt und ein ShaderObjekt. Ich initialisiere beide Objekte und übergebe dem IndexBufferObjekt vor dem Durchlauf des Mainloops Vertices in Form eines Arrays. Der IndexBuffer beschreibt die Daten welche er an die Grafikkarte weiterreicht, damit diese daraus Dreiecke zeichnen kann. In dem Mainloop werden die Daten dann gezeichnet.

Das funktioniert soweit schonmal!

Das will ich erreichen:
Jetzt möchte ich aber ein Objekt haben, welches mir per Funktion ein Dreieck erstellt und dieses an das IndexBufferObjekt übergibt um auch zur Laufzeit dynamisch Dreiecke erstellen zu können.

Mein Problem:
Bei der Übergabe des Dreiecks an das IndexBufferObjekt muss ich auf eine Funktion der Struktur zugreifen um dem IndexBuffer die InputDaten zu beschreiben. Der Zugriff auf die Daten wird mir allerdings nicht gewährt.
*Ich übergebe an dieser Stelle die Adresse des Objekt und keine Kopie von diesem*

Meine Code inkl. der verwendeten Klassen/Strukturen ( Ich habe versucht den Code auf die wichtigsten Sachen zu reduzieren ):

Meine VertexStruktur:
(Speichert die Position und Farbe eines Vektors in einem Koordinatensystem)

C++:
//Includes... (glm -> Grafiklib für die Vektorklassen)
struct Vertex
{
     glm::vec3 position;
     glm::vec3 color;
};



Meine ShapeGeneratorKlasse:
(Für die dynamische Erzeugung von geometrischen Objekten)

C++:
//Includes...
#define NUM_ARRAY_ELEMENTS(a) sizeof(a) / sizeof(*a)

ShapeData ShapeGenerator::makeTriangle()
{
     ShapeData result;
     Vertex myTri[] =
     {
         glm::vec3(+0.0f, +1.0f, +0.0f),//Position des Punktes
         glm::vec3(+1.0f, +0.0f, +0.0f),//Farbe des Punktes

         glm::vec3(+1.0f, -1.0f, +0.0f),//Position des Punktes
         glm::vec3(+0.0f, +1.0f, +0.0f),//Farbe des Punktes

         glm::vec3(-1.0f, -1.0f, +0.0f),//Position des Punktes
        glm::vec3(+0.0f, +0.0f, +1.0f)//Farbe des Punktes
    };

    result.numVertices = NUM_ARRAY_ELEMENTS(myTri);
     result.vertices = new Vertex[result.numVertices];
    memcpy(result.vertices, myTri, sizeof(myTri));

     GLushort indices[] = { 0,1,2 };

     result.numIndices = NUM_ARRAY_ELEMENTS(indices);
     result.indices = new GLushort[result.numIndices];
     memcpy(result.indices, indices, sizeof(indices));

     return result;
}



Meine ShapeDataStruktur:
(Allgemeine Struktur für die Übergabe geometrischer Objekte an den Buffer)

C++:
//Includes...
struct ShapeData
{
     ShapeData() :
         vertices(0), numVertices(0),
         indices(0), numIndices(0) {}
     Vertex* vertices;
     GLuint numVertices;
     GLushort* indices;
     GLuint numIndices;
     GLsizeiptr vertexBufferSize() const
     {
         return numVertices * sizeof(Vertex);
     }
     GLsizeiptr indexBufferSize() const
     {
         return numIndices * sizeof(GLushort);
     }

     friend class indexbuffer;
};



Meine IndexBufferKlasse:
(Hier bekomme ich eine Fehlermeldung!)

C++:
//Includes...
IndexBuffer::IndexBuffer(GLsizei count)
        : m_Count(count)
{
        //Generieren des VertexBuffers
        //Generieren des IndexBuffers
        //Beschreiben der Daten welche den Buffern übegeben werden
}

void IndexBuffer::addData(ShapeData *data)
{        
        // Bei den folgenden 2 Funktionen tritt beim Compilieren der Fehler auf!
        // Error C3867: ShapeData::vertexBufferSize: non-standard sysntax;
        // use '&' to create a pointer to member.
        //Ich kann hier nicht auf die Funktion von Data zugreifen.

        //Buffern des VertexBuffers
    glBufferSubData(GL_ARRAY_BUFFER,0, data->vertexBufferSize,data->vertices);
        //Buffern des IndexBuffers
    glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0,                                  data->indexBufferSize,data->indices);
}

void IndexBuffer::bind() const
{
    //Binden der Buffer...
}

void IndexBuffer::unbind() const
{
    //Entbinden der Buffer...        
}



Meine MainFunktion:
()

C++:
void main()
{
    Window window("Test", 500, 500);//Fenster erstellen
    DWORD loop_start_time;

    IndexBuffer bo(100000); //IndexBufferObjekt erzeugen
    bo.bind();

    Shader so("source/shaders/basic.vert", "source/shaders/basic.frag"); //ShaderObjekt
    so.enable();

    ShapeData tri = ShapeGenerator::makeTriangle();//ShapeData für Übergabe
    bo.addData(&tri); //Übergabe der Adresse des ShapeDataObjektes
    
    while (!window.closed())//Hauptschleife
    {
        loop_start_time = GetTickCount();
        window.clear();
        glDrawArrays(GL_TRIANGLES, 0, 3);
        window.update();
        while ((GetTickCount() - loop_start_time) < 40); //Framebremse
    }
}



Zum Fehler in der IndexBuffer.cpp:

Ich verstehe die Fehlermeldung nicht wirklich. So wie ich das interpretiert habe, soll ich einen Pointer erstellen, welcher auf die Adresse des Objektes verweist und diesen benutzen. Aber in meiner MainFunktion übergebe ich doch schon nur die Adresse des ShapeData Objektes ('&'). ???

Langsam beschleicht mich das Gefühl, dass ich bei den Pointern irgendwas falsch verstanden habe...

Ich wäre über eine Hilfestellung bezüglich meines Problems sehr dankbar.

p.s. Auch kontruktive Kritik über die Struktur meines Programmes und meines Programmierstils wären bestimmt hilfreich.

Vielen Dank im Vorraus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.01.2016, 15:16 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,


C++:
data->vertexBufferSize



und


C++:
data->indexBufferSize



sind keine Attribute - Sondern Funktionen.

d.h du musst sie auch als solche benutzen:


C++:
glBufferSubData(GL_ARRAY_BUFFER,0, data->vertexBufferSize(), data->vertices);
//Buffern des IndexBuffers
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, data->indexBufferSize(), data->indices);


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.01.2016, 15:31 Uhr
Lehrerkind



Wow, das war ja peinlich...

Dankeschön!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: