您的位置:首页 > 运维架构

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

2014-07-08 20:37 337 查看
一:画蓝色矩形
上一节中我们已经测试配置,画了一个白色的矩形,在黑色的窗体中。

我们调用的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);三者的区别

效果如图所示:







方法如下,只需在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

效果如图:



方法代码:

//画正弦函数
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();
}

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





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

先看效果图:



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

代码片段:

//正反面概念
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();
}

七:前面我们看到了线段的镂空即虚线,实际上图片也有镂空,但是随着技术的发展,这种单位图的镂空已被淘汰,有兴趣的话可以自己上网搜搜。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: