creating indices for terrain

Started by
7 comments, last by steg 20 years, 11 months ago
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

If it isn't working, take a bath, have a think and try again...

Advertisement
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.


  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]

<hr />
Sander Marechal<small>[Lone Wolves][Hearts for GNOME][E-mail][Forum FAQ]</small>

Thanks Sander,

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.

If it isn't working, take a bath, have a think and try again...

It seems your triangle vertices are arranged like this:
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...
What?
Or to render a MxM patch with only one index buffer call.

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]

If it isn't working, take a bath, have a think and try again...

Just out of interest, this is how I now create my indices :


    	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]

If it isn't working, take a bath, have a think and try again...

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; 


What?
Thanks BFuselek,

Just found this bug in my code and changed it as you have shown!

Thanks again.
Steve

If it isn't working, take a bath, have a think and try again...

This topic is closed to new replies.

Advertisement