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();
}
二:画圆
画圆根据几何只是确定坐标即可,不过这里需要注意的是
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();
}
七:前面我们看到了线段的镂空即虚线,实际上图片也有镂空,但是随着技术的发展,这种单位图的镂空已被淘汰,有兴趣的话可以自己上网搜搜。
上一节中我们已经测试配置,画了一个白色的矩形,在黑色的窗体中。
我们调用的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();
}
七:前面我们看到了线段的镂空即虚线,实际上图片也有镂空,但是随着技术的发展,这种单位图的镂空已被淘汰,有兴趣的话可以自己上网搜搜。
相关文章推荐
- [OpenGL]利用OpenGL绘制一些简单的图形
- OpenGL入门学习——第三课 绘制几何图形的一些细节问题
- OpenGL入门学习 课程 (三) 绘制几何图形的一些细节问题
- OpenGL入门学习之三——绘制几何图形的一些细节问题
- 图像处理入门,一些简单的基于像素几何变换和实现
- OpenGL入门学习——第二课 绘制几何图形
- OpenGL 简单图形程序
- OpenGL_Qt学习笔记之_02(绘制简单平面几何图形)
- opengl 绘制简单图形
- 提供一些简单的C++入门程序(提供源代码)
- VS2012下基于Glut OpenGL显示一些立体图形示例程序:
- mac上学用opengl(3)-画简单的三维图形
- 入门系列--OpenGL最简单的入门
- OpenGL最简单的入门
- 简单易懂的程序语言入门小册子(1.5):基于文本替换的解释器,递归定义与lambda演算的一些额外说明
- OpenGL入门学习之二——绘制几何图形
- C#入门不简单(上网找beginning c# objects时看到的一些话,很有同感)
- OpenGL编程轻松入门之一个简单的例子
- Android 中的 OpenGL 简单入门 (下)
- 关于用swing绘制一些简单的图形