OpenGL入门——画一些简单的图形

一:画蓝色矩形 
 

上一节中我们已经测试配置,画了一个白色的矩形,在黑色的窗体中。

我们调用的glClear(GL_COLOR_BUFFER_BIT)是为了初始化窗体,其实我们也可以用glcolor(,,);设置初始化窗体的颜色。

这里我们画一个蓝色的矩形只是需要在之前的代码中加一句glColor3f(0.0f, 1.0f, 1.0f);即可,代码如下:

</pre><pre name="code" class="cpp">#include "stdafx.h"
//#include <stdlib.h>
//#define GLUT_DISABLE_ATEXIT_HACK 
//http://blog.sina.com.cn/s/blog_639bd2d00100vu7d.html
#include <gl\glut.h>
#include <math.h>



//画矩形//
void myDisplay()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.0f, 1.0f, 1.0f);//ARGB颜色分量
	glIndexi(3000);
	glRectf(-.5f, -.5f, .5f, .5f);
	glFlush();
}
int _tmain(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); 
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(400, 400);
	glutCreateWindow("First OpenGL Programming");
	glutDisplayFunc(&myDisplay);
	glutMainLoop();
	return 0;
}

二:画圆

画圆根据几何只是确定坐标即可,不过这里需要注意的是

glBegin(GL_POLYGON);glBegin(GL_LINE_LOOP);glBegin(GL_POINTS);三者的区别

效果如图所示:


OpenGL入门——画一些简单的图形_第1张图片


OpenGL入门——画一些简单的图形_第2张图片

方法如下,只需在main中改变方法名即可运行!

//画圆//
const int n = 20;
const GLfloat R = 0.5f;
const GLfloat Pi = 3.1415926536f;

void myDisplay_sphere(void)
{
	int i;
	glClear(GL_COLOR_BUFFER_BIT);
	//glBegin(GL_POLYGON);
	//glBegin(GL_LINE_LOOP);
	glBegin(GL_POINTS);
	for (i = 0; i < n; ++i)
	{
		glVertex2f(R*cos(2 * Pi / n*i), R*sin(2 * Pi / n*i));
	}
	glEnd();
	glFlush();
}

三:花五角星

这个五角星假设所在的正五边形的边长为1.0f,设五角星的中心到五个点的距离为a.

结果如图:



方法的代码如下,运行同上:

//画五角星
void myDisplay_pentagram()
{
	GLfloat a = 1 / (2 * cos(54 * 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);
	glBegin(GL_LINE_LOOP);
		glVertex2fv(PointA);
		glVertex2fv(PointC);
		glVertex2fv(PointE);
		glVertex2fv(PointB);
		glVertex2fv(PointD);
		glEnd();
		glFlush();
}

四:画正弦函数

这个跟圆类似,只要会几何函数都是so easy

效果如图:


OpenGL入门——画一些简单的图形_第3张图片

方法代码:

//画正弦函数
const GLfloat factor = 0.1f;
void myDisplay_Sin()
{
	GLfloat x;
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_LINES);
	glVertex2f(-1.0f, 0.0f);
	glVertex2f(1.0f, 0.0f);
	glVertex2f(0.0f, -1.0f);
	glVertex2f(0.0f, 1.0f);
	glEnd();
	glBegin(GL_LINE_STRIP);
	for (x = -1.0f / factor; x < 1.0f / factor; x += 0.01f)
	{
		glVertex2f(x*factor, sin(x)*factor);
	}
	glEnd();
	glFlush();
}

五:画点和画虚线

代码:

//画点
void myDisplay_Point()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glPointSize(5.0f);
	glBegin(GL_POINTS);
		glVertex2f(0.0f, 0.0f);
		glVertex2f(0.5f, 0.5f);
	glEnd();
	glFlush();
}

//画虚线
void myDisplay_DottedLine()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glEnable(GL_LINE_STIPPLE);//启动虚线模式
	glLineStipple(2, 0x0F0F);//设置虚线样式和虚线的个数
	glLineWidth(10.0f);
	glBegin(GL_LINES);
		glVertex2f(0.0f, 0.0f);
		glVertex2f(0.5f, 0.5f);
	glEnd();
	glFlush();
}

效果图:(这个只需了解函数的意思,即可画出)

OpenGL入门——画一些简单的图形_第4张图片

OpenGL入门——画一些简单的图形_第5张图片

六:前面几个我们接触的都是二维的,然而在三维的概念里,有正反面之说,这里我们以一个小例子讲解,设置顺逆时针代表正面和反面

先看效果图:


由效果图可见,我们对不同面的图片纹理不一样,一个是填充,一个是线性

代码片段:

//正反面概念
void myDisplay_Front()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glPolygonMode(GL_FRONT, GL_FILL);//设置正面为填充模式
	glPolygonMode(GL_BACK, GL_LINE);//设置反面为线性模式
	//glFrontFace(GL_CCW);  //设置逆时针方向为正面
	glFrontFace(GL_CW);  //设置顺时针方向为正面
	glBegin(GL_POLYGON);  //按逆时针绘制一个正方形,在左下方
		glVertex2f(-0.5f, -0.5f);
		glVertex2f(0.0f, -0.5f);
		glVertex2f(0.0f, 0.0f);
		glVertex2f(-0.5f, 0.0f);
	glEnd();

	glBegin(GL_POLYGON);  //按顺时针绘制一个正方形,在右上方
	glVertex2f(0.0f, 0.0f);
	glVertex2f(0.0f, 0.5f);
	glVertex2f(0.5f, 0.5f);
	glVertex2f(0.5f, 0.0f);
	glEnd();

	glFlush();
}

七:前面我们看到了线段的镂空即虚线,实际上图片也有镂空,但是随着技术的发展,这种单位图的镂空已被淘汰,有兴趣的话可以自己上网搜搜。

你可能感兴趣的:(图形,OpenGL,vs2012)