glDrawElements und glDrawRangeElements



  • Hallo zusammen

    ich komm mit dem Unterschied zwischen den beiden Funktionen nicht so klar.
    Ist der Range Befehl dazu da ein grosses VBO einzuschränken - ich kann nicht
    erkenne wo da ein Unterschied sein soll - Adresse ist doch Adresse.

    Ach ja - gibt es eine Möglichkeit nur einen Teil eines Indexbuffers zu rendern?

    Also Beispiel - ich habe einen Indexbuffer mit 100 Indices und will nur
    Indices 30..55 ausgeben??

    Gruss Peter



  • glDrawRangeElements sagt OpenGL, dass die Werte im Indexbuffer nicht über oder unter einem bestimmten Wert sind. So kann der Cache optimiert werden, indem keine unnötige Daten des VBO geladen werden auf welches der Index zeigt.

    Nur einen Teil des Indexbuffers kannst du mit beiden Funktionen benutzen.

    Dazu verschiebt man den Pointer der Indexliste auf die Position des ersten zu rendernden Indexes. Hier ein wenig ungetesteter Code:

    #include <stdint.h>
    
    int getGLenumSize(GLenum theType)
    {
        switch(theType)
        {
            case GL_UNSIGNED_BYTE: return sizeof(GLubyte);
            case GL_UNSIGNED_SHORT: return sizeof(GLushort);
            case GL_UNSIGNED_INT: return sizeof(GLuint);
            default: return 0;
        }
    }
    
    glDrawElementsStartAtIndex(GLenum mode, GLsizei count, GLenum type, GLvoid *Indexbuffer, int startAtIndex)
    {
        GLvoid *IndexbufferStart = reinterpret_cast<GLvoid*>(reinterpret_cast<uintptr_t>(Indexbuffer) + static_cast<uintptr_t>(getGLenumSize(type) * startAtIndex));
    
        glDrawElements(mode, count, type, IndexbufferStart);
    }
    

Anmelden zum Antworten