creating indices for terrain
Hi all,
I want to generate quads for my terrain using index buffers, now I can get the indices correct for the first row of them, but I''m confused as how to do the indices for the next row ?
Any help is much appreciated,
Steve
Here''s one meothod. WIDTH is the width of your terrain (in vertices so it would be in the order of 2^n+1). Also, I assume you are rendering triangle strips.
myIndices now holds in sequence the indices for (WIDTH-1) triangle strips. Each strip consists of (WIDTH*2) indices.
Sander Maréchal
[Lone Wolves Game Development][RoboBlast][Articles][GD Emporium][Webdesign][E-mail]
int i=0;for (int z=0; z<WIDTH-1; z++){ for (int x=0; x<WIDTH; x++) { myIndices[i]=z*WIDTH+x; myIndices[i+1]=(z+1)*WIDTH+x; i+=2; }}
myIndices now holds in sequence the indices for (WIDTH-1) triangle strips. Each strip consists of (WIDTH*2) indices.
Sander Maréchal
[Lone Wolves Game Development][RoboBlast][Articles][GD Emporium][Webdesign][E-mail]
Thanks Sander,
I am actually rendering with triangle lists...
Here is how I do the indices for one row of quads :
Thus indices for first row of three quads :
0,1,2,3,2,1 - first quad
2,3,4,5,4,3 - second quad
4,5,6,7,6,5 - third quad
I''ve hard coded the values for the next row to see what they should be, this looks like :
I just cannot see a pattern to all this which is making it difficult for me to write a loop to do all the indices ?! I guess I''m making this more complex than it should be ?
Any suggestions ?
Thanks,
Steve
As I get older, my mind becomes more cluttered.
I am actually rendering with triangle lists...
Here is how I do the indices for one row of quads :
int offset = 0;for(int z=0; z < m_zDim; z++) { m_pIndices[index] = z + offset; m_pIndices[index+1] = z + 1 + offset; m_pIndices[index+2] = z + 2 + offset; m_pIndices[index+3] = z + 3 + offset; m_pIndices[index+4] = z + 2 + offset; m_pIndices[index+5] = z + 1 + offset; index += 6; offset += 1; }
Thus indices for first row of three quads :
0,1,2,3,2,1 - first quad
2,3,4,5,4,3 - second quad
4,5,6,7,6,5 - third quad
I''ve hard coded the values for the next row to see what they should be, this looks like :
// 1st quad 2nd row m_pIndices[index] = 1; m_pIndices[index+1] = 8; // 7 diff m_pIndices[index+2] = 3; m_pIndices[index+3] = 9; m_pIndices[index+4] = 3; m_pIndices[index+5] = 8; index += 6; // 2nd quad 2nd row m_pIndices[index] = 3; m_pIndices[index+1] = 9; // 6 diff m_pIndices[index+2] = 5; m_pIndices[index+3] = 10; m_pIndices[index+4] = 5; m_pIndices[index+5] = 9; index += 6; // 3rd quad 2nd row m_pIndices[index] = 5; m_pIndices[index+1] = 10; // 5 diff m_pIndices[index+2] = 7; m_pIndices[index+3] = 11; m_pIndices[index+4] = 7; m_pIndices[index+5] = 10;
I just cannot see a pattern to all this which is making it difficult for me to write a loop to do all the indices ?! I guess I''m making this more complex than it should be ?
Any suggestions ?
Thanks,
Steve
As I get older, my mind becomes more cluttered.
It seems your triangle vertices are arranged like this:
??
That seems a little strange. A better arrangement would be:
This way your algorithm will work on each row...
8 - 9 -10 -11| | | |1 - 3 - 5 - 7| | | |0 - 2 - 4 - 6
??
That seems a little strange. A better arrangement would be:
8 - 9 -10 -11| | | |4 - 5 - 6 - 7| | | |0 - 1 - 2 - 3
This way your algorithm will work on each row...
Or to render a MxM patch with only one index buffer call.
But this will also generate degenerate tris when it loops back. Most of the time this is ok, but you may need to tweak the source data a bit to make it work. What happens is when you get verts like \./ (three verts, one in middle lowest. If that happens on an edge you will get a degenerate tri that shows up. Either tweak the data or find some other method...I''ve yet to find anyone who knows how to render a square patch with one tri strip without the degenerates.
m_pIndexBuffer = new unsigned short[(PATCH_SIZE+1) * 2 * (PATCH_SIZE)]; // Create triangle strips int idx = 0; for (int y=0; y < PATCH_SIZE; ++y) { if (y % 2 == 0) { for (int x = 0; x <= PATCH_SIZE; ++x) { m_pIndexBuffer[idx++] = y * (PATCH_SIZE+1) + x; m_pIndexBuffer[idx++] = (y + 1) * (PATCH_SIZE+1) + x; } } else { for (int x = PATCH_SIZE; x >= 0; --x) { m_pIndexBuffer[idx++] = (y + 1) * (PATCH_SIZE+1) + x; m_pIndexBuffer[idx++] = y * (PATCH_SIZE+1) + x; } } }
But this will also generate degenerate tris when it loops back. Most of the time this is ok, but you may need to tweak the source data a bit to make it work. What happens is when you get verts like \./ (three verts, one in middle lowest. If that happens on an edge you will get a degenerate tri that shows up. Either tweak the data or find some other method...I''ve yet to find anyone who knows how to render a square patch with one tri strip without the degenerates.
Thanks guys,
I now have my tri's arranged as follows :
0 - 1 - 2 - 3
4 - 5 - 6 - 7
8 - 9 -10 -11
Obviously now easier to do the algoritm now!
Kindest regards,
Steve
As I get older, my mind becomes more cluttered.
[edited by - steg on May 8, 2003 3:47:46 AM]
I now have my tri's arranged as follows :
0 - 1 - 2 - 3
4 - 5 - 6 - 7
8 - 9 -10 -11
Obviously now easier to do the algoritm now!
Kindest regards,
Steve
As I get older, my mind becomes more cluttered.
[edited by - steg on May 8, 2003 3:47:46 AM]
Just out of interest, this is how I now create my indices :
Regards,
Steve
As I get older, my mind becomes more cluttered.
[edited by - steg on May 8, 2003 5:09:08 AM]
int index = 0; int offset = 0; m_pIndices = new WORD[m_xDim * m_yDim]; for(int row=0; row<=m_yDim; row++) { for(int col=0; col < m_xDim; col++) { m_pIndices[index] = col + 4 + offset; m_pIndices[index+1] = col + offset; m_pIndices[index+2] = col + 5 + offset; m_pIndices[index+3] = col + 1 + offset; m_pIndices[index+4] = col + 5 + offset; m_pIndices[index+5] = col + offset; index += 6; } offset += 4; }
Regards,
Steve
As I get older, my mind becomes more cluttered.
[edited by - steg on May 8, 2003 5:09:08 AM]
Well, that''s good and it gets the job done. But what happens when you change the width to say, 8? You have to go through and change all those magic numbers don''t you? You have the width of the mesh in m_xDim, so you could change the inner loop to:
{ m_pIndices[index] = col + m_xDim + offset; m_pIndices[index+1] = col + offset; m_pIndices[index+2] = col + (m_xDim + 1) + offset; m_pIndices[index+3] = col + 1 + offset; m_pIndices[index+4] = col + (m_xDim + 1) + offset; m_pIndices[index+5] = col + offset; index += 6;}offset += m_xDim;
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement