2016-11-16 9 views
0

データをリストにプッシュバックしてからOpenGL glBufferDataでこのリストを使用すると問題が発生します。OpenGL - Cのリストにデータを割り当ててglBufferDataで使用すると正しく動作しない

私は3つの異なるスプライトバッチを使って3つのスプライトを描画する単純なOpenGLシーンを持っています。これは、頂点のメモリをあらかじめ割り当てておき、スプライトの頂点にこの頂点配列を使用してからリストに戻ったときに機能します。しかし、私が望むのはスプライトの頂点を直接リストにプッシュすることです。これはうまくいかず、3つの三角形(ハーフスプライト)しか得られません。

sb-> verticesはリストです。

これは動作し、3つのスプライトを描画します。

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

私は考えた:これは動作していない

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

はわずか3ハーフスプライトを描画しますこのようなリストに戻ると、連続したb glBufferDataで使用できるメモリのロック。ここで

が)私はglBufferData(呼び出す方法です:

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

これは、リストのコードです:あなたは、リスト構造体で作成する何

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]; 
} 

答えて

2

ポインタの連続したメモリであるそのデータを含む連続したメモリではない。 OpenGLでは、データを含む配列(例えば、最初のコードサンプルに配列vertices)を渡すことが必要です。

関連する問題