1.菜单
OpenGL 自己有设置菜单的函数,这对于一直写控制台程序的我来说,显的非常好玩.下面的代码,我们定义了一个鼠标右键的特性,
可以下拉两个菜单,清屏和退出.
#include <GL/glut.h>
#include <stdio.h>
#include <cmath>
void mymenu(int value)
{
if(value == 1)
{
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();//or glFlush()
glutAttachMenu(GLUT_RIGHT_BUTTON);
}
if(value == 2)
exit(0);
}
void init()
{
glutCreateMenu(mymenu);//添加菜单,要得到菜单项的整数值
glutAddMenuEntry("Clear Screen",1);//
glutAddMenuEntry("Exit",2);
glutAttachMenu(GLUT_RIGHT_BUTTON);//绑定到鼠标键
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutCreateWindow("Hello,world!");
// glutDisplayFunc(display);//glutDisplayFunc(void (*func)(void))
glClear(GL_COLOR_BUFFER_BIT);
init();
glutMainLoop();//导致程序进入一个事件
}
2.将菜单和一个五角星综合起来
#include <GL/glut.h>
#include <stdio.h>
#include <cmath>
const GLfloat Pi = 3.1415926536f;
void display()//欠缺几何方面的知识
{
GLfloat a = 1 / (2-2*cos(72*Pi/180));
GLfloat bx = a * cos(18 * Pi/180);
GLfloat by = a * sin(18 * Pi/180);
GLfloat cy = -a * cos(18 * Pi/180);
GLfloat
PointA[2] = { 0, a },
PointB[2] = { bx, by },
PointC[2] = { 0.5, cy },
PointD[2] = { -0.5, cy },
PointE[2] = { -bx, by };
glClear(GL_COLOR_BUFFER_BIT);
// 按照A->C->E->B->D->A的顺序,可以一笔将五角星画出
glBegin(GL_LINE_LOOP);
glVertex2fv(PointA);
glVertex2fv(PointC);
glVertex2fv(PointE);
glVertex2fv(PointB);
glVertex2fv(PointD);
glEnd();
glFlush();
}
void mymenu(int value)
{
if(value == 1)
{
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();//or glFlush()
glutAttachMenu(GLUT_RIGHT_BUTTON);
}
if(value == 2)
exit(0);
}
void init()
{
glutCreateMenu(mymenu);//添加菜单,要得到菜单项的整数值
glutAddMenuEntry("Clear Screen",1);//
glutAddMenuEntry("Exit",2);
glutAttachMenu(GLUT_RIGHT_BUTTON);//绑定到鼠标键
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutCreateWindow("Hello,world!");
glutDisplayFunc(display);//glutDisplayFunc(void (*func)(void))
//glClear(GL_COLOR_BUFFER_BIT);
init();
glutMainLoop();//导致程序进入一个事件
}
3.如何渲染多边形
启动函数,主要我是看看他们放在什么位置,注意正反面
//多边形类型
#include<GL/glut.h>
#include<stdio.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glPolygonMode(GL_FRONT,GL_FILL);//设置正面为填充模式
glPolygonMode(GL_BACK,GL_LINE);//设置反面为线性模式
glFrontFace(GL_CW);//设置逆时针方向为正面
glBegin(GL_POLYGON);//按逆时针绘制一个正方形,在左下方
glVertex2f(-0.5,-0.5);
glVertex2f(0.0,0.5);
glVertex2f(0.0,0.0);
glVertex2f(-0.5,0.0);
glEnd();
glBegin(GL_POLYGON);//按顺 dram a recent
glVertex2f(0.0,0.0);
glVertex2f(0.0,0.5);
glVertex2f(0.5,0.5);
glVertex2f(0.5,0.0);
glEnd();
glFlush();
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutCreateWindow("NNN");
glutDisplayFunc(display);
glutMainLoop();
}
4.如何渲染正反面,注意函数的位置
//多边形类型
#include<GL/glut.h>
#include<stdio.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glPolygonMode(GL_FRONT,GL_FILL);//设置正面为填充模式
glPolygonMode(GL_BACK,GL_LINE);//设置反面为线性模式
glFrontFace(GL_CCW);//
glEnable(GL_CULL_FACE);//开启特性
glCullFace(GL_BACK);//指定隐藏的那面
glBegin(GL_POLYGON);//按逆时针绘制一个正方形,在左下方
glVertex2f(-0.5,-0.5);
glVertex2f(0.0,0.5);
glVertex2f(0.0,0.0);
glVertex2f(-0.5,0.0);
glEnd();
glBegin(GL_POLYGON);//按顺 dram a recent
glVertex2f(0.0,0.0);
glVertex2f(0.0,0.5);
glVertex2f(0.5,0.5);
glVertex2f(0.5,0.0);
glEnd();
glDisable(GL_CULL_FACE);//关闭特性
glFlush();
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutCreateWindow("NNN");
glutDisplayFunc(display);
glutMainLoop();
}
(图片有毛病)
5.镂空多边形,代码同上,只是提前把相关函数放进去了
镂空正面
镂空反面