quick question regarding translucency and GL_BLEND

Started by
11 comments, last by 3dnewbie 17 years, 4 months ago
Hi, I setup blending and it all works fine. Translucency to. Really nice to see it work :-). At first i didn't but then i changed the order around of the objects being drawn and voila. anyway, my question is this: I have a blue quad like so glColor4f(0.0f,0.0f,0.1f,0.1f); It is nice blue with blending disabled. When blending is turned on however, i get an almost black square. At this point it is completly translucent. The more i turn up the alpha level however, the less translucent it gets (that's expected ofcourse) and the more it get's back to it's original level of opaqueness. However, the more i do so, the quad seems to be drawn as 2 triangles each with different colors. This is kind of unwanted :-). I think i understand why it does this, but i would like it to retain the quad and color i set which display without blending enabled, and then if i increase the alpha value, that it becomes more or less translucent.
Advertisement
Quote:Original post by 3dnewbie
However, the more i do so, the quad seems to be drawn as 2 triangles each with different colors.

This is kind of unwanted :-). I think i understand why it does this...
Hm, maybe you could post your theory. Offhand I can't think of why the colors of the triangles in the quad would differ.

You might also post the code where you render the quad.
Well there's not much to post, i just draw a quad, set alpha channel to 0.5, and when i turn on blending i get a quad separated by 2 triangles each of different colour. It's transparent/translucent sure, but not in a particular nice way :-)
Well, something must be happening to cause the effect you describe, and without seeing the code it's hard to say what that might be. So again, I'd go ahead and post the code where you render the quad.
Ok, i'll post some pieces, i hope it's not to much. I've read about this phenomena and it seems to be normal, although i can't believe that. Maybe i should use ARB extension?

This is the code responsible for drawing a matrix:
GLvoid display_grid(GLvoid){	glBegin(GL_QUADS);	for(x=-10.0;x<GRID_SIZE;x+=SECTOR_SIZE) {	for(y=-10.0;y<GRID_SIZE;y+=SECTOR_SIZE) {	/* Set color for QUADS */	glColor4f(0.0f,0.0f,0.1,0.1f);	/* Draw QUADS */	glVertex3f(x,y,0); /* left */	glVertex3f(x,y+SECTOR_SIZE,0); /* left */ 	glVertex3f(x,y,0); /* right up*/ 	glVertex3f(x+SECTOR_SIZE,y,0); /* right down */	glVertex3f(x+SECTOR_SIZE,y+SECTOR_SIZE,0); /* leftbottom */	glVertex3f(x,y+SECTOR_SIZE,0); /* rightbottom */ 	glVertex3f(x+SECTOR_SIZE,y,0); /* leftupper*/ 	glVertex3f(x+SECTOR_SIZE,y+SECTOR_SIZE,0);			}	}	glEnd();		glBegin(GL_LINES);	for(x=-10.0;x<GRID_SIZE;x+=SECTOR_SIZE) {	for(y=-10.0;y<GRID_SIZE;y+=SECTOR_SIZE) {	/* Set color for LINES */	glColor4f(0.0f,0.2f,0.0,1.0f);	/* Draw lines */	glVertex3f(x,y,0); /* left */	glVertex3f(x,y+SECTOR_SIZE,0); /* left */ 	glVertex3f(x,y,0); /* right up*/ 	glVertex3f(x+SECTOR_SIZE,y,0); /* right down */	glVertex3f(x+SECTOR_SIZE,y+SECTOR_SIZE,0); /* leftbottom */	glVertex3f(x,y+SECTOR_SIZE,0); /* rightbottom */ 	glVertex3f(x+SECTOR_SIZE,y,0); /* leftupper*/ 	glVertex3f(x+SECTOR_SIZE,y+SECTOR_SIZE,0);		}	}	glEnd();}



This is at the users request to toggle options:

GLvoid engine_options(GLvoid){/* Statistics and engine options  */	if(STATISTICS)	display_stats();		if(DEPTH_TEST) 	glEnable(GL_DEPTH_TEST);	else glDisable(GL_DEPTH_TEST);		if(BLENDING) 	glEnable(GL_BLEND);	else glDisable(GL_BLEND);		if(ANTIALIASING) {	glEnable(GL_POINT_SMOOTH);	glEnable(GL_LINE_SMOOTH);	glEnable(GL_POLYGON_SMOOTH);	glHint(GL_POINT_SMOOTH,GL_NICEST);	glHint(GL_LINE_SMOOTH,GL_NICEST);	glHint(GL_POLYGON_SMOOTH,GL_NICEST);}	else {	glDisable(GL_POINT_SMOOTH);	glDisable(GL_LINE_SMOOTH);	glDisable(GL_POLYGON_SMOOTH);	}		if(TEXTURE_2D)	glEnable(GL_TEXTURE_2D);	else glDisable(GL_TEXTURE_2D);		if(COORDINATE) {	for(x=-10.0;x<GRID_SIZE;x+=SECTOR_SIZE) {	for(y=-10.0;y<GRID_SIZE;y+=SECTOR_SIZE) {	/* Set color for font because bitmap function is buggy */	glColor4f(1.0,1.0,1.0,1.0);	renderbitmapfont(x,y,0,"x%1.1f y%1.1f",x,y);		}	}	}	}


This is called upon initialization:

GLint dl_display_grid;GLfloat x,y,z;GLvoid init(GLvoid){		/* Add texture loading routine here */	/* Enable default 2D texturing */	glEnable(GL_TEXTURE_2D);		TEXTURE_2D=!TEXTURE_2D;							glShadeModel(GL_SMOOTH);							glClearColor(0.0f, 0.0f, 0.0f, 0.5f);		/* Enable default Depth testing */											glClearDepth(1.0f);								glEnable(GL_DEPTH_TEST);							glDepthFunc(GL_LEQUAL);		DEPTH_TEST=!DEPTH_TEST;								glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);		/* Enable default Blending */	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);	//glBlendFunc(GL_DST_COLOR,GL_ZERO);	glEnable(GL_BLEND);	BLENDING=!BLENDING;		/* Enable default anti-aliasing */	glEnable(GL_POINT_SMOOTH);	glEnable(GL_LINE_SMOOTH);	glEnable(GL_POLYGON_SMOOTH);	glHint(GL_POINT_SMOOTH,GL_NICEST);	glHint(GL_LINE_SMOOTH,GL_NICEST);	glHint(GL_POLYGON_SMOOTH,GL_NICEST);	ANTIALIASING=!ANTIALIASING;		/* Setup display lists */	//dl_display_grid=glGenLists(1);	//glNewList(dl_display_grid,GL_COMPILE);	//	display_grid();	//glEnd();	//glEndList();		}


I init GLUT with:
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_ALPHA);


I also have an if statement in my main rendering loop that keeps my HUD on top of the screen even when blending is disabled by drawing it last, but this shouldn't really matter.
Quote:
/* Draw QUADS */
glVertex3f(x,y,0); /* left */
glVertex3f(x,y+SECTOR_SIZE,0); /* left */
glVertex3f(x,y,0); /* right up*/
glVertex3f(x+SECTOR_SIZE,y,0); /* right down */

glVertex3f(x+SECTOR_SIZE,y+SECTOR_SIZE,0); /* leftbottom */
glVertex3f(x,y+SECTOR_SIZE,0); /* rightbottom */
glVertex3f(x+SECTOR_SIZE,y,0); /* leftupper*/
glVertex3f(x+SECTOR_SIZE,y+SECTOR_SIZE,0);


Unless I've totally forgotten my OpenGL knowledge, that draws 2 quads, and neither have 4 valid coordinate sets. I'm surprised it looks correct in any circumstances.

Your comments are inconsistent too.
uhh hmm. well if they would be all be considered vertices it would be correct. as GL_LINES always needs 2 vertice points, that is correct. For GL_QUADS i think you're right (one vertice defines one line?). In that case i would have to fix it. Argh.

Could this be the reason for the triangle artifact appearing ?

don't mind the comments, i know they have to be corrected.
Polygons have as many vertices as they have edges (quads being the special case of polygons with 4 of each). They don't "define" each other because each edge connects two adjacent vertices, and each vertex is at the common point of two adjacent edges. However, you're normally supposed to "visit" each vertex in order, either clockwise or counter-clockwise around the polygon. That should look like:

glVertex3f(x, y, 0);glVertex3f(x, y + SECTOR_SIZE, 0);glVertex3f(x + SECTOR_SIZE, y + SECTOR_SIZE, 0);glVertex3f(x + SECTOR_SIZE, y, 0);


I hope I don't need too much explanation where I got those values from :)
Well yes but am i correct in that although 4 glVertex calls are enough to define a quad as opposed to needing 8 glVertex calls for lines, GL_QUAD does also accepts 8 vertex calls (a bit redundant maybe, but it still seems to work.
You can specify any number of vertices within a glBegin(GL_QUADS); glEnd(); block. The first four vertices will define the first quad. The next four vertices will define a second quad. And so on (if the number of vertices is not divisible by four the remainder will be ignored). So your call draws two quads, not one, both of which are degenerate. If you want one quad then specify exactly four distinct co-planar vertex coordinates.

Σnigma

This topic is closed to new replies.

Advertisement