Well recently i have been trying to see if it is possible to use a single vbo to hold multiple vbo’s. For example I’m trying to make a Text rendering sub that uses vbo however i do not want to bind a new vbo unless i truly have to for each symbols XY, UV, and RBGA. So I’m a little confused on if this is possible and if not then why not? Also If it is not possible any other way i can do things to make it better?
Here is the source for my text rendering class that I’m trying to get to use multiple VBO’s into a single VBO.
void create_text_vertex(text *str, widget *control)//must be done every text change
{
float x2,x = 0;
float y2,y = 0;
char *p = str->data;
float w, h;
float textx,texty;
float texx,texy,texw,texh;
GLuint index[4] = {0,1,2,3};
textx = str->xy.x + control->actualpos.x;
texty = str->xy.y + control->actualpos.y;
if(str->textbuf.buffer == NULL){
str->textbuf.buffer = (vertex_array *)calloc(1, 16 * sizeof(vertex_array));
str->size = 16;
str->count = 0;
}
while(*p){
texx = (float)character[*p].x / 256;
texw = (float)(character[*p].x + character[*p].glyph_bitmap->bitmap.width)/ 256;
texy = (float)character[*p].y / 128;
texh = (float)(character[*p].y + character[*p].glyph_bitmap->bitmap.rows)/ 128;
x2 = (x + character[*p].glyph_bitmap->left);
y2 = (y - character[*p].glyph_bitmap->top) ;
w = (character[*p].glyph_bitmap->bitmap.width);
h = (character[*p].glyph_bitmap->bitmap.rows + str->resize);
y = texty; //reset Y to the original other wise text becomes out of control XD.
//Moves a certain amount of space After the symbol based on glyph set size.
x += (character[*p].advancex >> 6) + str->resize;
y += (character[*p].advancey >> 6) + 12;
if (!character[*p].glyph_bitmap->bitmap.width || !character[*p].glyph_bitmap->bitmap.rows){
p++; continue;
}
if(str->count >= str->size){
str->size = (uint16)next_power_of_two(str->size + 2);
text_resize_buffer(str->textbuf.buffer,str->size);
}
/*index 0*/
str->textbuf.buffer[str->count].vertex[0].u = texx; str->textbuf.buffer[str->count].vertex[0].v = texy;
str->textbuf.buffer[str->count].vertex[0].x = x2; str->textbuf.buffer[str->count].vertex[0].y = y2;
str->textbuf.buffer[str->count].vertex[0].r = str->col.r; str->textbuf.buffer[str->count].vertex[0].b = str->col.b; str->textbuf.buffer[str->count].vertex[0].g = str->col.g; str->textbuf.buffer[str->count].vertex[0].a = str->col.a;
/*index 1*/
str->textbuf.buffer[str->count].vertex[1].u = texw; str->textbuf.buffer[str->count].vertex[1].v = texy;
str->textbuf.buffer[str->count].vertex[1].x = x2 + w; str->textbuf.buffer[str->count].vertex[1].y = y2;
str->textbuf.buffer[str->count].vertex[1].r = str->col.r; str->textbuf.buffer[str->count].vertex[1].b = str->col.b; str->textbuf.buffer[str->count].vertex[1].g = str->col.g; str->textbuf.buffer[str->count].vertex[1].a = str->col.a;
/*index 2*/
str->textbuf.buffer[str->count].vertex[2].u = texx; str->textbuf.buffer[str->count].vertex[2].v = texh;
str->textbuf.buffer[str->count].vertex[2].x = x2; str->textbuf.buffer[str->count].vertex[2].y = y2 + h;
str->textbuf.buffer[str->count].vertex[2].r = str->col.r; str->textbuf.buffer[str->count].vertex[2].b = str->col.b; str->textbuf.buffer[str->count].vertex[2].g = str->col.g; str->textbuf.buffer[str->count].vertex[2].a = str->col.a;
/*index 3*/
str->textbuf.buffer[str->count].vertex[3].u = texw; str->textbuf.buffer[str->count].vertex[3].v = texh;
str->textbuf.buffer[str->count].vertex[3].x = x2 + w; str->textbuf.buffer[str->count].vertex[3].y = y2 + h;
str->textbuf.buffer[str->count].vertex[3].r = str->col.r; str->textbuf.buffer[str->count].vertex[3].b = str->col.b; str->textbuf.buffer[str->count].vertex[3].g = str->col.g; str->textbuf.buffer[str->count].vertex[3].a = str->col.a;
str->count++;
p++;
}
glGenBuffers(1,&str->textbuf.vertex_buffer);
glGenBuffers(1,&str->textbuf.index_buffer);
glBindBuffer(GL_ARRAY_BUFFER,str->textbuf.vertex_buffer);
glBufferData(GL_ARRAY_BUFFER,str->size *( 4 * sizeof(vertex_t)),str->textbuf.buffer,GL_STATIC_DRAW);//fill up the array with vertex and color-data
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,str->textbuf.index_buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,4 * sizeof(GLuint),index,GL_STATIC_DRAW);//this one with indices
}
void text_draw_beta(text *str, widget *parent)
{
char *p = str->data;
uint16 count = 0;
uint32 use = 0;
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glColor4f(str->col.r , str->col.g , str->col.b , str->col.a);// set the image color properties, 1 being highest 0.0000 being lowest
glBindTexture(GL_TEXTURE_2D, texture);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, str->textbuf.index_buffer);
glIndexPointer(GL_UNSIGNED_INT,sizeof(GLuint),0);
glBindBuffer(GL_ARRAY_BUFFER, str->textbuf.vertex_buffer);
while(*p){
if (!character[*p].glyph_bitmap->bitmap.width || !character[*p].glyph_bitmap->bitmap.rows){
p++; continue;
}
glVertexPointer(2, GL_FLOAT, sizeof(struct vertex_t), 0);
glTexCoordPointer(2, GL_FLOAT, sizeof(struct vertex_t), (GLvoid *)offsetof(struct vertex_t, u));
glColorPointer(4, GL_FLOAT, sizeof(struct vertex_t), (GLvoid *)offsetof(struct vertex_t, r));
glDrawElements(GL_TRIANGLE_STRIP, 4 ,GL_UNSIGNED_INT,0); //GL_TRIANGLE_STRIP
count++;
p++;
}
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
struct multi_buffer{
GLuint vertex_buffer; //texture vertex buffer.
GLuint index_buffer; //index buffer.
vertex_array *buffer;
};
struct vertex_t {
float x, y;
float u, v;
float r, g, b, a;
};
struct vertex_array {
vertex_t vertex[4];
};
hopefully someone can at least point me in the right direction.