triangle.c
来自「OpenGL的大海量资料收集」· C语言 代码 · 共 201 行
C
201 行
#include<windows.h>
#include<gl/glut.h>
#include<math.h>
#define GL_PT 3.1415f
static GLfloat xRot=0.0f;
static GLfloat yRot=0.0f;
BOOL bCull=FALSE;
BOOL bOutline=FALSE;
BOOL bDepth=FALSE;
void ProcessMenu(int value)
{
switch(value)
{
case 1:
bDepth=!bDepth;
break;
case 2:
bCull=!bCull;
break;
case 3:
bOutline=!bOutline;
default:
break;
}
glutPostRedisplay();
}
/*Called to draw scene*/
void RenderScene(void)
{
GLfloat x,y,angle;
int iPivot =1;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
if(bCull)
glEnable(GL_CULL_FACE);//启动消除多边形
else
glDisable(GL_CULL_FACE);//关闭消除多边形
if(bDepth)
glEnable(GL_DEPTH_TEST);//启动深度测试
else
glDisable(GL_DEPTH_TEST);//关闭深度测试
if(bOutline)
glPolygonMode(GL_BACK,GL_LINE);//背面生成多边形轮廓
else
glPolygonMode(GL_BACK,GL_FILL);//背面生成填充多边形
/*保存矩阵状态 并且进行旋转带*/
glPushMatrix();
glRotatef(xRot,1.0f,0.0f,0.0f);
glRotatef(yRot,0.0f,1.0f,0.0f);
/*begin a triangle fan*/
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0f,0.0f,75.0f);
for(angle=0.0f;angle<(2.0f*GL_PT); angle+=(GL_PT/8.0f))
{
x=50.0f*sin(angle);
y=50.0f*cos(angle);
if((iPivot %2)==0)
glColor3f(0.0f,1.0f,0.0f);
else
glColor3f(1.0f,0.0f,0.0f);
iPivot++;
glVertex2f(x,y);
}
/*Done drawing fan for cone*/
glEnd();
/*begin a new triangle fan to cover the bottom*/
glBegin(GL_TRIANGLE_FAN);
/**/
glVertex3f(0.0f,0.0f,75.0f);
/**/
for(angle=0.0f;angle<(2.0f*GL_PT); angle+=(GL_PT/8.0f))
{
/**/
x=50.0f*sin(angle);
y=50.0f*cos(angle);
/**/
if((iPivot % 2)==0)
glColor3f(0.0f,1.0f,0.0f);
else
glColor3f(1.0f,0.0f,0.0f);
/**/
iPivot++;
/**/
glVertex2f(x,y);
}
/*Done drawing the fan that covers the bottom*/
glEnd();
glPopMatrix();
glutSwapBuffers();
}
/*THIS FUNCTION DOES ANY NEEDED INITIALIZATION ON THE RENDERING */
void SetupRC()
{
/*black background*/
glClearColor(1.0f,1.0f,1.0f,1.0f);
/*set drawing color to green*/
glColor3f(0.0f,1.0f,0.0f);
glShadeModel(GL_FLAT);
glFrontFace(GL_CW);
}
void SpacialKeys(int key,int x,int y)
{
if(key==GLUT_KEY_UP)
xRot-=5.0F;
if(key==GLUT_KEY_DOWN)
xRot+=5.0f;
if(key==GLUT_KEY_LEFT)
yRot-=5.0f;
if(key==GLUT_KEY_RIGHT)
yRot+=5.0f;
if(key>356.0f)
xRot=0.0f;
if(key<-1.0f)
xRot=355.0f;
if(key>356.0f)
xRot=0.0f;
if(key<-1.0f)
xRot=355.0f;
/*REFRESH THE WINDOW*/
glutPostRedisplay();
}
void ChangeSize(int w,int h)
{
GLfloat nRange=100.0f;
if(h==0)
h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,-nRange,nRange);
else
glOrtho(-nRange*w/h,nRange*w/h,-nRange,nRange,-nRange,nRange);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutCreateWindow("Triangle OpenGL Example");
glutCreateMenu(ProcessMenu);
glutAddMenuEntry("Toggle depth test",1);
glutAddMenuEntry("Toggle cull test",2);
glutAddMenuEntry("Toggle outline back test",3);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutReshapeFunc(ChangeSize);
glutSpecialFunc(SpacialKeys);
glutDisplayFunc(RenderScene);
SetupRC();
glutMainLoop();
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?