2016-11-16 1 views
0

J'ai un problème lorsque je repasse des données dans une liste et que j'utilise cette liste dans OpenGL glBufferData.OpenGL - L'allocation de données à une liste en C et son utilisation dans glBufferData ne fonctionne pas correctement

J'ai une simple scène OpenGL, où je dessine 3 sprites en utilisant 3 spritebatches différents. Cela fonctionne quand j'alloue au préalable de la mémoire pour les sommets, puis j'utilise ce tableau de vertex pour les sommets des sprites, puis je repousse à la liste. Mais ce que je veux, c'est repousser les sommets des sprites directement dans la liste, ce qui ne marche pas et je n'ai que 3 triangles (demi-sprites).

sb-> vertices est une liste.

Cela fonctionne et tire 3 sprites:

void add_verts(sprite_batch* sb, sprite* s[]) 
{ 
    int cv = 0; // Current vertex 

    vertex* vertices; // Allocate memory for vertices 
    vertices = malloc(sb->sprite_count * sizeof(vertex) * 6); // Each sprite has 6 vertices 

    for(unsigned int i = 0; i < sb->sprite_count; i++) 
    { 
     // Top right 
     vertices[cv++] = s[i]->tr; 
     list_push_back(sb->vertices, &vertices[cv-1]);  

     // Top left 
     vertices[cv++] = s[i]->tl; 
     list_push_back(sb->vertices, &vertices[cv-1]); 

     // Bottom left 
     vertices[cv++] = s[i]->bl; 
     list_push_back(sb->vertices, &vertices[cv-1]);  

     // Bottom left 
     vertices[cv++] = s[i]->bl; 
     list_push_back(sb->vertices, &vertices[cv-1]); 

     // Bottom right 
     vertices[cv++] = s[i]->br; 
     list_push_back(sb->vertices, &vertices[cv-1]); 

     // Top right 
     vertices[cv++] = s[i]->tr; 
     list_push_back(sb->vertices, &vertices[cv-1]); 
    } 
} 

Working version

Cela ne fonctionne pas et ne consomme que 3 demi-sprites:

void add_verts(sprite_batch* sb, sprite* s[]) 
{ 
    for(unsigned int i = 0; i < sb->sprite_count; i++) 
    {  
     // Top right 
     list_push_back(sb->vertices, &s[i]->tr); 

     // Top left 
     list_push_back(sb->vertices, &s[i]->tl); 

     // Bottom left 
     list_push_back(sb->vertices, &s[i]->bl); 

     // Bottom left 
     list_push_back(sb->vertices, &s[i]->bl); 

     // Bottom right 
     list_push_back(sb->vertices, &s[i]->br); 

     // Top right 
     list_push_back(sb->vertices, &s[i]->tr); 
    } 
} 

Not working

Je pensais repoussant à la liste comme ceci donnerait b b verrou de mémoire que je pourrais utiliser dans glBufferData.

Voici comment j'appelle glBufferData():

glBufferData(GL_ARRAY_BUFFER, sb->vertices->num_items * sizeof(vertex), list_get(sb->vertices, 0), GL_STATIC_DRAW); 

Voici le code pour la liste:

typedef struct 
{ 
    int num_items; 
    int num_slots; 
    void** items; 
} list; 

static void list_reserve_more(list* l) 
{ 
    if (l->num_items > l->num_slots) 
    { 
     l->num_slots = ceil((l->num_slots + 1) * 1.5); 
     l->items = realloc(l->items, sizeof(void*) * l->num_slots); 
    } 
} 

void list_push_back(list* l, void* item) 
{ 
    l->num_items++; 
    list_reserve_more(l); 
    l->items[l->num_items-1] = item; 
} 

void* list_get(list* l, int index) 
{ 

    if (index < 0) { printf("Index out of bounds"); return NULL; } 
    if (index >= l->num_items) { printf("Index out of bounds"); return NULL; } 

    return l->items[index]; 
} 

Répondre

2

Qu'est-ce que vous créez dans votre struct liste est une mémoire continue de pointeurs aux données, pas une mémoire continue contenant les données. OpenGL s'attend à ce que vous passiez un tableau contenant les données (par exemple, le tableau vertices dans votre premier exemple de code).