View Full Version : Weird Color Behavior

02-11-2006, 07:51 AM
I ma having some weird color behavior. I have a random color generator that I have create a color for each polygon I need to draw. The code looks like this where numPolygons is what it sounds like, the number of polygons I have:

colors = (GLfloat *)malloc(numPolygons*3*sizeof(GLfloat));

srand( (unsigned) time( NULL ) );
GLfloat randomNum;

// Create an array to hold the colors
for( int i = 0 ; i < ( numPolygons * 3 ) ; i++ )
randomNum = ( (GLfloat) rand( ) ) / RAND_MAX;
colors[i] = randomNum;
When I draw this with display lists, I manually enter the array of colors to retrieve the RGB values for each polygon. Every polygon has its own unique color. But when I draw the object with vertex arrays, I have polygons next to each other having the same colors. When I debug, I discover these colors should not be the same. My code for this looks like:

// Enable use of vertex array
glEnableClientState ( GL_VERTEX_ARRAY );
// Enable use of RGB color array
glEnableClientState ( GL_COLOR_ARRAY );

// Specify pointer to vertex array
// (No. coordinates per vertex, type, byte offset,
// pointer to array)
glVertexPointer ( 3, GL_DOUBLE, 0, vertices );
// Specify pointer to color array
// Same structure as array pointer
glColorPointer ( 3, GL_FLOAT, 0, colors );Then when I display the polygons I use this simple code where numPolygons are the number of plygons to draw, numPoints are the number of points (vertices) per polygon and indices is the array holding my 3-dimensional vertices:

for( int i = 0 ; i < ( numPoints * numPolygons ) ; i = ( i + numPoints ) )
glDrawElements( GL_POLYGON, numPoints, GL_UNSIGNED_INT, &amp;indices[i] );
}Does it look like I am doing something wrong? I know I must be if I am not coloring all my polygons correctly. Thanks for your help again!

02-11-2006, 12:51 PM
Your post suggest that your color array stores a color per polygon. This is not how vertex arrays works in OpenGL; you cannot have per-polygon data in an array, only per-vertex data. So the color array must store one color for each vertex, not one color for each polygon.

02-11-2006, 08:47 PM
So would I want 3 values for each color for each vertex? A red, green, and blue color values? So my array size would need to be something like where numVertices is the number of vertices in my object:

colors = (GLfloat *)malloc( numVertices * 3 * sizeof(GLfloat) );Thanks for your continued help.

02-12-2006, 12:21 PM
As Bob said, you need per vertex colors. That means you need a complete color defined for each vertex.

glDrawElements takes the index array and the number of indexes, not vertexes.

Your loop is totally insane, probably don't even need it ;) The point of DrawElements is to draw a big batch of primitives at one time. Decompose your polygons into a single list of triangles for example then make a single call to DrawElements on a per texture/shader basis.