Opengl Lesson 1 心形曲线

今天我们开始学习Opengl编程。

在学习之前,我们要开始配置Opengl,我这里使用的是VS2010,语言是C++。
Opengl是C++的一个拓展包,用来进行计算机图形方面的编程。Opengl实用工具库(Opengl Utility Tooklit, GLUT)是独立于窗口系统的工具包,可以隐藏不同窗口系统API所带来的复杂性。
所以这里我们首先要去下载 freeglut,然后具体配置可以参看网页:http://blog.csdn.net/dayeshisir/article/details/7433631。

配置好环境,就开始学习如何使用Opengl编程。
第一步就是要导入glut.h头文件。我们今天要绘制的是心形线,通过查阅资料可以获取其参数方程:
x= a*(2*sin(t)-sin(2*t))
y= a*(2*cos(t)-cos(2*t))

由于所以要使用sin和cos函数,所以我们导入头文件math.h。

#include <GL/glut.h>
#include <math.h>
#define PI 3.14159265358979323846
下一步是要初始化设置。 glClearColor的作用是来清除RGBA模式下的颜色缓冲区,其中的四个参数分别代表red、green、blue和alpha值。

void init()

{
	glClearColor(1.0f,1.0f,1.0f,1.0f);
}
下一步是设置回调函数display。
首先我们先定义一个参数方程里的常数a使得最终绘制出的心能够在窗口里。
然后我们调用glClear函数来清除颜色缓冲区( GL_COLOR_BUFFER_BIT),还记得我们在初始化函数里设定的RGBA颜色值吗?这里就是用当前的缓冲区清除值来清除指定的缓冲区。
下一步调用glColor*函数是用来指定下面我们绘制的点、线、面是什么颜色,函数里有三个参数,分别代表 red、green、blue的强度值,大小从0.0-1.0。我们这里要绘制红色的心,所以把red强度设为1,其余两个设为0。
下面就到了最关键的环节,就是绘制图像。我们只需要在g lBegin()和glEnd()函数里设置我们所需要绘制的点,然后在glBegin参数里使用 GL_POLYGON,即为画凸多边形(为什么设为 GL_POLYGON? 因为当我们所画的点足够多的时候,就能够近似看做曲线),而后Opengl会把glBegin和glEnd里面所有绘制的点依次相连然后填充其内部,就得到了我们所需要绘制的心形线。
最后glFlush是强制完成绘图操作,相当于刷新的功能,这样我们的绘制部分就完成啦!

void display(void)
{
	GLfloat a=0.25;
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0f,0.0f,0.0f);
	glBegin(GL_POLYGON);
		for(GLfloat t=0;t<2*PI;t+=0.01)
		{
			GLfloat x=a*(2*sin(t)-sin(2*t)),y=a*(2*cos(t)-cos(2*t));
			glVertex2f(x,y);
		}
	glEnd();
	glFlush();
}

最后就是编写主函数。我们知道C++的主函数里包含了两个参数argc和argv,这里我们在初始化GLUT的时候也要用到。
首先我们初始化GLUT,调用glutInit函数,里面包含两个参数即为主函数的两个参数。
然后我们初始化显示模式,调用 glutInitDisplayMode,里面有三个参数,分别为 GLUT_SINGLE(单缓冲), GLUT_RGB(RGBA颜色模式), GLUT_DEPTH(带有深度缓冲区)
而后我们定义窗口大小,使用 glutInitWindowSize,里面两个参数分别为窗口的宽和高。
定义窗口位置,使用 glutInitWindowPosition,里面两个参数分别为窗口左上角的屏幕位置。
创建窗口,使用 glutCreateWindow,里面的参数为窗口的标题。
调用初始化函数init。
glutDisplayFunc函数是GLUT用来绑定回调 函数display,当GLUT窗口里的内容需要重新显示时,通过 glutDisplayFunc注册的那个回调函数就会被执行
最后,必须使用glutMainLoop来启动程序,所有已经创建的窗口将会在这里显示,对这些窗口的渲染也将开始生效。
int main(int argc, char** argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
	glutInitWindowSize(300,300);
	glutInitWindowPosition(300,300);
	glutCreateWindow("Cardioid");
	init();
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

到这里所有的工作就做完啦~下面是运行出来的结果:


“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

felixour

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值