三角扇CCW指定顶点还是CW?

#define FREEGLUT_STATIC
#include <GL/glut.h>

GLfloat nRange=10.0f;
GLfloat xRot=0.0f;
GLfloat yRot=0.0f;

void SetupRC()
{
	glClearColor(0.0f,0.0f,0.0f,1.0f);
	glColor3f(1.0f,0.0f,0.0f);
}

void RenderScene()
{
	glClear(GL_COLOR_BUFFER_BIT);

	glPushMatrix();
	glRotatef(xRot,1.0f,0.0f,0.0f);
	glRotatef(yRot,0.0f,1.0f,0.0f);

	glPolygonMode(GL_FRONT,GL_LINE);
	glBegin(GL_TRIANGLE_FAN);
	glVertex3f(0.0f,0.0f,0.0f);
	glVertex3f(5.0f,-1.0f,0.0f);
	glVertex3f(7.0f,3.0f,0.0f);
	glVertex3f(3.0f,7.0f,0.0f);
	
	glEnd();

	glPopMatrix();
	glutSwapBuffers();
}

void SpecialKeys(int key,int x,int y)
{
	if(key==GLUT_KEY_UP)
		xRot-=2.0f;
	if(key==GLUT_KEY_DOWN)
		xRot+=2.0f;
	if(key==GLUT_KEY_LEFT)
		yRot+=2.0f;
	if(key==GLUT_KEY_RIGHT)
		yRot-=2.0f;

	glutPostRedisplay();
}

void ChangeSize(int w,int h)
{
	if(h==0)
		h=1;
	glViewport(0,0,w,h);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if(w<=h)
		glOrtho(-nRange,nRange,-nRange,nRange*h/w,1.0f,-1.0f);
	else
		glOrtho(-nRange,nRange*w/h,-nRange,nRange,1.0f,-1.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glutPostRedisplay();
}

int main(int argc,char** argv)
{
	glutInit(&argc,argv);
	glutInitWindowSize(800,600);
	glutCreateWindow("Testing CW/CCW On Trianglefan");

	glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
	glutDisplayFunc(RenderScene);
	glutReshapeFunc(ChangeSize);
	glutSpecialFunc(SpecialKeys);

	SetupRC();
	glutMainLoop();
	return 0;
}

  因为SuperBible中关于TriangleFan的章节在讲述TriangleFan是怎样绘制的时候,是顺时针的。I wonder if it is right. So i did check it.

  程序中指定顶点是按照逆时针指定的,并且PolygonMode为GL_LINE(默认的模式为GL_FILL,CCW为正面),从结果可以看出:

正面(CCW方向)是边框模式绘制的,背面(CW方向)是填充绘制的。

有图为证:

 

posted @ 2013-04-01 14:25  Tup  阅读(261)  评论(0)    收藏  举报