On Tue, 16 Jul 2002, Keith Whitwell wrote:
> > Well, it's not high on my list. I don't think flat-shading is used that
> > often, and the changes don't have any effect on smooth shading. Actually,
> > it _eliminates_ some saves/restores necessary for unfilled polygons with
> > hardware flat-shading.
> >
> > Actually, I think the problem is larger than mach64. Rage128 has the same
> > problem and it appears to have GL compliant flat-shading based on the
> > primitive. The problem is that for clipped polygons, the primitive type
> > changes, so flat-shading breaks down in that case (like with unfilled
> > polygons). I think the templates would have to be changed to copy the
> > provoking-vertex color of the polygon being clipped into the vertices of
> > the triangles generated by clipping, rather than interpolating the color.
>
> I'm surprised that this isn't working. Can you verify? I tested on the i810
> at the time & definitely got clipping working there...
Here's a couple screenshots with the r128 driver (20020629 build):
http://www.retinalburn.net/linux/r128-unclipped-flat.png
http://www.retinalburn.net/linux/r128-clipped-flat.png
Allen's test program is attached. Maybe someone could check this on
Radeon with software tcl as well?
--
Leif Delgass
http://www.retinalburn.net
/*
* Clipped faces are not colored correctly with flat shading (except for
* the yellow face which only has one color).
* Use the left button to spin, middle button to zoom.
*/
#include <GL/glut.h>
static void init ( const char* filename )
{
// Set the window's background color
glClearColor( .25, .25, .25, 1. );
glShadeModel( GL_FLAT );
glEnable( GL_DEPTH_TEST );
}
static void display ( void )
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glBegin( GL_QUAD_STRIP );
glColor3f( 1., 0., 0. ); /* red */
glVertex3f( -1., -1., -1. );
glVertex3f( -1., -1., 1. );
glColor3f( 0., 0., 1. ); /* blue */
glVertex3f( -1., 1., -1. );
glVertex3f( -1., 1., 1. );
glColor3f( 0., 1., 0. ); /* green */
glVertex3f( 1., 1., -1. );
glVertex3f( 1., 1., 1. );
glColor3f( 1., 0., 1. ); /* magenta */
glVertex3f( 1., -1., -1. );
glVertex3f( 1., -1., 1. );
glColor3f( 1., 0., 0. ); /* red */
glVertex3f( -1., -1., -1. );
glVertex3f( -1., -1., 1. );
glEnd();
glBegin( GL_QUADS );
glColor3f( 1., 0., 0. ); /* red */
glVertex3f( -1., -1., -1. );
glColor3f( 0., 0., 1. ); /* blue */
glVertex3f( -1., 1., -1. );
glColor3f( 0., 1., 0. ); /* green */
glVertex3f( 1., 1., -1. );
glColor3f( 0., 1., 1. ); /* cyan */
glVertex3f( 1., -1. , -1. );
glColor3f( 1., 1., 0. ); /* yellow */
glVertex3f( -1., -1., 1. );
glVertex3f( 1., -1. , 1. );
glVertex3f( 1., 1., 1. );
glVertex3f( -1., 1., 1. );
glEnd();
glutSwapBuffers();
}
static void reshape ( int width, int height )
{
glViewport( 0, 0, width, height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -1.5, 1.5, -1.5, 1.5, -2, 2 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glRotatef( 40., 1., 0., 0. );
glRotatef( 50., 0., 1., 0. );
glRotatef( 10., 1., 0., 0. );
}
static enum MouseAction { NONE, SPIN, ZOOM } action = NONE;
static int m_x = 0;
static int m_y = 0;
static void mouse ( int button, int state, int x, int y )
{
if ( button == 0 ) {
if ( state == 0 )
action = SPIN;
else
action = NONE;
}
else if ( button == 1 ) {
if ( state == 0 )
action = ZOOM;
else
action = NONE;
}
m_x = x;
m_y = y;
}
static GLdouble modelview[16];
static void motion ( int x, int y )
{
int dx = x - m_x;
int dy = y - m_y;
switch ( action ) {
case SPIN:
glRotated( dy, modelview[0], modelview[4], modelview[8] );
glRotated( dx, modelview[1], modelview[5], modelview[9] );
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
break;
case ZOOM:
glMatrixMode( GL_PROJECTION );
if ( dy > 0 )
glScalef( .99, .99, .99 );
else
glScalef( 1.01, 1.01, 1.01 );
glMatrixMode( GL_MODELVIEW );
}
m_x = x;
m_y = y;
glutPostRedisplay();
}
static void key ( unsigned char key, int x, int y )
{
switch ( key ) {
case 27:
exit( 0 );
}
}
int main ( int argc, char* argv[] )
{
// Standard GLUT setup commands
glutInit( &argc, argv );
glutInitWindowSize( 500, 500 );
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow( argv[0] );
printf( "%s %s\n", glGetString( GL_VERSION ), glGetString( GL_RENDERER ) );
init( argv[1] );
glutReshapeFunc( reshape );
glutDisplayFunc( display );
glutMouseFunc( mouse );
glutMotionFunc( motion );
glutKeyboardFunc( key );
glutMainLoop();
return 0;
}