little question about drawelement

Started by
7 comments, last by Aragon 18 years, 1 month ago
hi @all i play around with openGL since a few days and now i want to create an 50x50grid for example (base for landscapes) i play around with the examples from redbook but how can i add here texturecoordinates and normals to the code here? google/nehe/codesampler/etc offers me no real tutorial "in one piece" to learn about drawelements, only little pieces i am not able to complete so i took that way to pick sample of rebook that works and learn by modifying that but my question is: how can i add my textures and normal coordinates to that 'v' thing and how use the texture in draw call then ? and p.s.: if you can tell me where to activate z buffer ;)


#define NFACE 6
#define NVERT 8
void drawCube(GLdouble x0, GLdouble x1, GLdouble y0,
GLdouble y1, GLdouble z0, GLdouble z1)
{
static GLfloat v[8][3];
static GLfloat c[8][4] = {
{0.0, 0.0, 0.0, 1.0}, {1.0, 0.0, 0.0, 1.0},
{0.0, 1.0, 0.0, 1.0}, {1.0, 1.0, 0.0, 1.0},
{0.0, 0.0, 1.0, 1.0}, {1.0, 0.0, 1.0, 1.0},
{0.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}
};
/* indices of front, top, left, bottom, right, back faces */
static GLubyte indices[NFACE][4] = {
{4, 5, 6, 7}, {2, 3, 7, 6}, {0, 4, 7, 3},
{0, 1, 5, 4}, {1, 5, 6, 2}, {0, 3, 2, 1}
};

....

// Vertices Positions 
v[0][0] = v[3][0] = v[4][0] = v[7][0] = x0;
v[1][0] = v[2][0] = v[5][0] = v[6][0] = x1;
v[0][1] = v[1][1] = v[4][1] = v[5][1] = y0;
v[2][1] = v[3][1] = v[6][1] = v[7][1] = y1;
v[0][2] = v[1][2] = v[2][2] = v[3][2] = z0;
v[4][2] = v[5][2] = v[6][2] = v[7][2] = z1;

//Normal Positions

// ????

// Texture Positions

// ????




//drawing example 


glEnable (GL_DEPTH_TEST);  // Z buffer is not working

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, g_textureID[0]); 

glEnableClientState (GL_VERTEX_ARRAY);
glEnableClientState (GL_COLOR_ARRAY);
glVertexPointer (3, GL_FLOAT, 0, v);
glColorPointer (4, GL_FLOAT, 0, c);

** ?!?!  glNORMALPointer (3, GL_FLOAT, 0, v);
** ?!?! glTEXTUREPointer (2, GL_FLOAT, 0, v);

glDrawElements(GL_QUADS, NFACE*4, GL_UNSIGNED_BYTE, indices);

glDisableClientState (GL_VERTEX_ARRAY);
glDisableClientState (GL_COLOR_ARRAY);

can you help me? much thx for all answers :) p.s.: i hate google
Advertisement
You don't "add" your normals and texture coordinates to the 'v' buffer -- you just create them in their own buffers, like you did with the colors (the 'c' buffer). For example:
static GLfloat t[8][2] = {{ ...your texture coords go here... },};

Then call:
glTexCoordPointer(2, GL_FLOAT, 0, t);
...as you already have. And don't forget to enable GL_TEXTURE_COORD_ARRAY.

The same style goes for normals too.

As for your Z buffer not working, it's possible you're not creating it when you initialize the pixel format. Or it could be you're not clearing it either (setting GL_DEPTH_BUFFER_BIT when calling glClear). I'd need to see more code to tell you exactly.

much thankx.. i start to understand how it works :)

and i works ..the textures are working perfekt
-> glTexCoordPointer (2, GL_FLOAT, 0, t);


what is the correct spell for normals to activate
like glTexNormalPointer (3, GL_FLOAT, 0, n) ; ?


for Z buffer, here
is my initialisation (fullscreen)
and start of my main(render)

much thx :)

void init( void){	EnumDisplaySettings( NULL, ENUM_CURRENT_SETTINGS, &g_oldDevMode );	int nMode = 0;	DEVMODE devMode;	bool bDesiredDevModeFound = false;	while( EnumDisplaySettings( NULL, nMode++, &devMode ) )	{				if( devMode.dmPelsWidth  != reso_x || devMode.dmPelsHeight != reso_y)			continue;		// Does this device mode support 32-bit color?		if( devMode.dmBitsPerPel != 32 )			continue;		// Does this device mode support a refresh rate of 75 MHz?		if( devMode.dmDisplayFrequency != 75 )			continue;		// We found a match, but can it be set without rebooting?		if( ChangeDisplaySettings( &devMode, CDS_TEST ) == DISP_CHANGE_SUCCESSFUL )		{			bDesiredDevModeFound = true;			break;		}	}	if( bDesiredDevModeFound == false )	{		// TO DO: Handle lack of support for desired mode...		return;	}	//	// Verify hardware support by enumerating pixel formats...	//	g_hDC = GetDC( g_hWnd );	PIXELFORMATDESCRIPTOR pfd;	int nTotalFormats = DescribePixelFormat( g_hDC, 1, sizeof(pfd), NULL );	int nPixelFormat;	for( nPixelFormat = 1; nPixelFormat <= nTotalFormats; ++nPixelFormat )	{		if( DescribePixelFormat( g_hDC, nPixelFormat, sizeof(pfd), &pfd ) == 0 )		{			DWORD dwErrorCode = GetLastError();			// TO DO: Respond to failure of DescribePixelFormat			return;		}		if( !(pfd.dwFlags & PFD_SUPPORT_OPENGL) )			continue;		if( !(pfd.dwFlags & PFD_DOUBLEBUFFER) )			continue;		if( !(pfd.dwFlags & PFD_DRAW_TO_WINDOW) && fullscreen==0 )			continue;		if( pfd.iPixelType != PFD_TYPE_RGBA )			continue;				if( pfd.cColorBits != 32 )			continue;		if( pfd.cDepthBits != 16 )			continue;		// If we made it this far, we found a match!		break;	}	//	// Everything checks out - create the rendering context and 	// switch the display settings with our new device mode...	//	if( SetPixelFormat( g_hDC, nPixelFormat, &pfd) == FALSE )	{		DWORD dwErrorCode = GetLastError();		// TO DO: Respond to failure of SetPixelFormat		return;	}	g_hRC = wglCreateContext( g_hDC );	wglMakeCurrent( g_hDC, g_hRC );	if( ChangeDisplaySettings( &devMode, CDS_FULLSCREEN ) != DISP_CHANGE_SUCCESSFUL )	{		// TO DO: Respond to failure of ChangeDisplaySettings		return;	}	loadTexture();	// Setup inits	glClearColor( 0.0f, 0.0f, 0.2f, 1.0f );	glEnable(GL_TEXTURE_2D);	glEnable (GL_DEPTH_TEST);	glMatrixMode( GL_PROJECTION );	glLoadIdentity();	gluPerspective( 45.0, (GLdouble)reso_x / reso_y, 0.0001, 100.0 );	int nNumTextureUnits = 0;        glGetIntegerv( GL_MAX_TEXTURE_UNITS_ARB, &nNumTextureUnits );	ShowCursor(false);}........................void render( void )	{    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );		//draw_land();		glMatrixMode( GL_MODELVIEW );	glLoadIdentity();
Normals are set with glNormalPointer.

Your initialization and glClear calls look fine. Have you set the Z comparison function to GL_LESS with glDepthFunc, and initialized glClearDepth to 1.0f?
Normals work fine now :)

but the Z Buffer problem is still there


void render( void )	{glDepthFunc(GL_LESS);glClearDepth(1.0);glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );



another thing i see now.. if the object hit the borders
the texture positions seems to be moved at this vertice
that are out of the screen.


much thanx for your time :)
Something doesn't sound right. Can you post a screenshot?
hurray ... i got it !!!!


in the init of opengl was the error!


-> //if( !(pfd.dwFlags & PFD_DRAW_TO_WINDOW) && fullscreen==0 )continue;

-> if( pfd.cDepthBits != 16 ) continue;

after diabling thoose two lines
the Z Buffer error was complete away,
the textures painted normal
and

the FPS raised from 6 FPS to 91 FPS



much much thankx for your fast help :)

(i post some screenshots when i get better with opengl ,
my networkcode and other things runs perfect
we work on an mmorpg and we decided to move from directx to opengl
and i need to reprogramm all basic graphic parts of the engine.
(to avoid the xp/vista chaos that will hit much gamers)
(the game is a bit like the old ultima online..in 3d but with old touch)

greetings sven













Quote:Original post by Aragon
in the init of opengl was the error!


-> //if( !(pfd.dwFlags & PFD_DRAW_TO_WINDOW) && fullscreen==0 )continue;

-> if( pfd.cDepthBits != 16 ) continue;

after diabling thoose two lines
the Z Buffer error was complete away,
the textures painted normal
and

the FPS raised from 6 FPS to 91 FPS


Hmm... it sounds like the pixel format checking code picked the Microsoft OpenGL driver, rather than your video card's driver.

It _might_ be that a cDepthBits of 16 wasn't good -- perhaps 24 would work better?

Glad it's fixed, though! :)
...thats very possible

i will work on the code to avoid such problems again,
but first i have to get much much deeper into openGL
to understand it..but i get quicker results
with opengl than with directx... thats absolut great

z buffer is working, index buffers working,
lighting is now working.. alpha transparency and colorkeying
is working..

what a wonderfull day :)

much thx again



This topic is closed to new replies.

Advertisement