OpenGL基本使用
头文件
<GL/glut.h>已经包含了<GL/gl.h>和<GL/glu.h>,所以不用再写后两个
#include <GL/glut.h> //GLUT头文件
main函数
所有的GLUT函数都带有glut
前缀。
初始化
初始化
- Void glutInit(int*argc,char**argv);
- Argc:一个指针,指向从main()函数传递过来的未更改的argc变量。
- Argv:一个指针,指向从main()函数传递过来的未更改的argv变量。
//GLUT初始化
glutInit(&argc, argv); //初始化GLUT
窗口位置和大小
窗口位置
- Void glutInitWindowPositon(int x,int y);
- X: 距离屏幕左边的像素数。默认值-1,默认出现在屏幕左上角。
- Y:距离屏幕上边的像素数。和X一样。
//确定窗口位置
glutInitWindowPosition(200, 200);
窗口大小
- Void glutInitWindowSize(int width,int height);
- Width:窗口的宽度。
- Height:窗口的高度。
//确定窗口大小
glutInitWindowSize(700, 700);
定义显示方式
定义显示方式
- Void glutInitDisplayMode(unsighed int mode)
- Mode:可以指定颜色模式、数量和缓冲区类型
- GLUT_RGBA / GLUT_RGB 默认的颜色模式
- GLUT_INDEX 指定颜色索引模式
- GLUT_SINGLE 单缓冲区窗口
- GLUT_BUFFER.双缓冲区窗口,产生流畅动画必选
…
//定义显示方式
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
设置窗口标题
设置窗口标题
- Int glutCreateWindow(char* title);
- Title:窗口的标题
//设置窗口标题
glutCreateWindow("cycle and square");
寄存回调
寄存回调
- void glutDisplayFunc(void (*func)(void));
- func: 当窗口需要被重绘是调用的函数的名称。注意使用NULL作为实参是错误的。
//寄存回调
glutDisplayFunc(&my_dis); //回调函数渲染
进入应用程序事件处理循环
进入应用程序事件处理循环
- void glutMainLoop(void)
//进入应用程序事件处理循环
glutMainLoop(); //持续显示,一直等待处理下一个事件
渲染函数
实现:圆,外接正方形,外接圆,外接正方形…
- 可以发现,将圆和外接正方形看做一组,每一组之间是 2 \sqrt{\smash[b]{2}} 2的关系,所以在每组后相应地改变半径。
清除缓冲区
用预制的值来清空缓冲区
- void glClear(GLbitfield mask);
//清除缓冲区
glClear(GL_COLOR_BUFFER_BIT); //可以理解为用某个颜色刷一遍窗口,glClearColor函数可以设定颜色,默认黑色。
glBegin
glBegin 与glEnd结合使用
- void glBegin(GLenum mode);
- mode:创建元素的类型,比如:点,线等。可以是以下数值:
- GL_POINTS:把每个顶点作为一个点进行处理,顶点n定义了点n,绘制N个点。
- GL_LINES: 把每个顶点作为一个独立的线段,顶点2n-1和2n之间定义了n条线段,绘制N/2条线段。
- GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,绘制n-1条线段。
- GL_LINE_LOOP: 绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n和n+1个顶点定义了线段n,绘制n条线段。
…
//glBegin
glBegin(GL_LINE_LOOP); //画闭合曲线
glEnd();
定点函数 - glVertex2f
glVertex2f
- void glVertex2f(GLfloat x,GLfloat y);
//glVertex2f
glVertex2f(1.0f, 3.0f);
glFlush
强制刷新缓冲,保证绘图命令将被执行
- void glFlush();
//强制刷新缓冲,保证绘图命令将被执行
glFlush();
函数渲染
void my_dis()
{
//cycle
glClear(GL_COLOR_BUFFER_BIT);
while(k<=4)
{
cout << "circle "<<k<<"\n";
glBegin(GL_LINE_LOOP);
for (int i = 1; i <= cnt; i++)
glVertex2f(r * cos(2 * pi * i / cnt), r * sin(2 * pi * i / cnt));
glEnd();
glFlush();
system("pause");
//半径乘根号二
r = sqrt(2) * r;
cout << "square " << k << "\n";
glBegin(GL_LINE_LOOP);
for (int j = 1; j <= 4; j++)
glVertex2f(r * cos(pi * j/ 2 - pi / 4), r * sin(pi *j / 2 - pi / 4));
glEnd();
glFlush();
system("pause");
k++;
//glFlush();
}
完整代码
#include<GL/glut.h>
#include <math.h>
#include<stdio.h>
#include <iostream>
using namespace std;
const int cnt = 100;
GLfloat pi = 3.1415926f;
GLfloat r = 0.3f; //半径
int k = 1;
void my_dis()
{
//cycle
glClear(GL_COLOR_BUFFER_BIT);
while(k<=4)
{
cout << "circle "<<k<<"\n";
glBegin(GL_LINE_LOOP);
for (int i = 1; i <= cnt; i++)
glVertex2f(r * cos(2 * pi * i / cnt), r * sin(2 * pi * i / cnt));
glEnd();
glFlush();
system("pause");
//半径乘根号二
r = sqrt(2) * r;
cout << "square " << k << "\n";
glBegin(GL_LINE_LOOP);
for (int j = 1; j <= 4; j++)
glVertex2f(r * cos(pi * j/ 2 - pi / 4), r * sin(pi *j / 2 - pi / 4));
glEnd();
glFlush();
system("pause");
k++;
//glFlush();
}
//glFlush();
//system("pause");
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv); //初始化GLUT
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(10, 10);
glutInitWindowSize(600, 600);
glutCreateWindow("cycle and square");
glutDisplayFunc(&my_dis); //回调函数
glutMainLoop();
system("pause");
return 0;
}