一:画蓝色矩形
上一节中我们已经测试配置,画了一个白色的矩形,在黑色的窗体中。
我们调用的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(); }