2016-11-16 8 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에서 사용할 수있는 메모리 잠금.

당신이 당신의 목록 구조체에서 만든 어떤
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

포인터의 연속 메모리입니다 :이 목록에 대한 코드입니다

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

: 여기

내가 glBufferData()를 호출하는 방법입니다 데이터를 포함하는 연속적인 메모리가 아닌 데이터에 적용됩니다. OpenGL은 데이터가 포함 된 배열 (예 : vertices 배열)을 첫 번째 코드 샘플에 전달해야합니다.