VBO

This topic is 3309 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

Recommended Posts

Can you help me with this VBO, I can't figure it out correctly : The cpyArray is declared like so : cpyArray[ROW][COL][3]; where row = 32, col =32.

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glVertexPointer(3,GL_FLOAT,0,cpyArray);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);



Share on other sites
I assume the array resembles a grid.

1. You don't specify texture coordinates, so you shouldn't enable GL_TEXTURE_COORD_ARRAY
2. Your array only has row*col vertices, so the last parameter of glDrawArrays should be ROW * COL (otherwise you'd read outside the VBO)
3. 4 consecutive vertices are used for one quad, so unless you specify most of the vertices multiple times (up to 4x) your grid will have gaps. I assume you want to use indices instead, i.e. glDrawElements(...)
4. Keep in mind that a quad must be planar, i.e. all vertices have to be in the same plane (e.g. same y-coord). If you want different heights for the vertices use 2 triangles instead.

Share on other sites
Looking at your code it seems like you are using just vertex array, not vertex buffer objects (VBO). Here is a tutorial that demonstrates the use of VBOs:
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45
(Note that in the article they somehow forgot the glEnableClientState calls, although they can be found in the code samples)

To use VBOs you have to call glBindBuffer with GL_ARRAY_BUFFER. Make sure GL_ARRAY_BUFFER is bound before calling glVertexPointer. When using VBOs as opposed to vertex arrays, the last parameter of glVertexPointer is relative to the beginning of the buffer object (so 0 in most cases). The buffer is called by calling glBufferData, which copies the vertex data to the GPU memory.

Share on other sites
Sorry, I have the wrong terminology. This is just a test to get vertex arrays
working with rendering terrain.

I draw the quads like this
		/*glBegin(GL_QUADS);			for( i = 0; i < ROW-1-stepRow; i+=stepRow)			{				float x0 = (float)i/ROW;				float x1 = (float)(i+1)/ROW;				for(j = 0; j < COL-1-stepCol; j+=stepCol)				{					float y0 = (float)j/COL;					float y1 = (float)(j+1)/COL;					//glColor3ub(Array[j][0],Array[j][1],Array[j][2]);					//counter clockwise					glTexCoord2f(y0,x0);glVertex3f(Array[j][0],Array[j][1],Array[j][2]);					glTexCoord2f(y0,x1);glVertex3f(Array[i+1][j][0],Array[i+1][j][1],Array[i+1][j][2]);					glTexCoord2f(y1,x1);glVertex3f(Array[i+1][j+1][0],Array[i+1][j+1][1],Array[i+1][j+1][2]);					glTexCoord2f(y1,x0);glVertex3f(Array[j+1][0],Array[j+1][1],Array[j+1][2]);				}			}		glEnd();*/

But am not sure how to convert this array so either glDrawElements or
glDrawArray accepts it correctly.

Share on other sites
To use it with glDrawElements you have to create a index buffer.

The indices can be calculated like this:

for(int c = 0; c < (COLS - 1); x++){  for(int r = 0; r < (ROWS - 1); r++)  {    //indices: 1st triangle of quad    int i1t1 = r * COLS + c;    int i2t1 = (r + 1) * COLS + c;    int i3t1 = r * COLS + c + 1        //indices: 2nd triangle of quad    int i1t2 = (r + 1) * COLS + c;    int i2t2 = (r + 1) * COLS + c + 1;    int i3t2 = r * COLS + c + 1  }}

And you should reread the documentation for glDrawArrays and glDrawElements. You have to specify the number of indices or vertices, not the number of floats. And any number you specify has to be less than or equal to the number of indices/vertices you use.

1. 1
2. 2
frob
16
3. 3
4. 4
5. 5

• 13
• 13
• 61
• 14
• 15
• Forum Statistics

• Total Topics
632125
• Total Posts
3004252

×