【图形学】Vol.1 - OpenGL基本使用

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值