实验一 OpenGL初识
实验类型:验证型 实验学时:2实验要求:必修
一、实验目的
熟悉编程环境;了解光栅图形显示器的特点;了解计算机绘图的特点;利用VC+OpenGL作为开发平台设计程序,以能够在屏幕上生成任意一个像素点为本实验的结束。
二、实验内容:
了解和使用VC的开发环境,理解简单的OpenGL程序结构;掌握OpenGL提供的基本图形函数,尤其是生成点的函数;编写图1所示图形的应用程序并调试运行。
图1 基本图形 |
升级版本1:
升级版本2:
三、实验原理
绘图程序基本结构可分为3部分:
1 初始化部分。主要是设置一些OpenGL的状态开关,如颜色模式(RGBA或Alpha)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检测,裁剪等等。这些状态一般都用函数glEnable(...), glDisable(…)来设置,…表示特定的状态。
2 设置观察坐标系下的取景模式和取景框位置大小。
3 OpenGL的主要部分,使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系、几何变换、光照处理等等。
四、实验示范代码(略)
五、实验步骤
1 在Windows xp/win7操作环境下,启动VC;
2 建立W32 Console Application 的应用工程;
3 建立源程序编辑环境,进行编辑源程序。
4 调试运行程序,完成实验。
六、实验结果处理
演示结果并保存相关文件。
七、实验注意事项
注意编程环境的配置,即在Windows环境下,OpenGL扩展库相关文件的配置,把头文件“GL.H”、库文件“OPENGL32.LIB”和动态链接库“OPENGL32.DLL”配置到相应的目录下。
八、预习与思考题
预习:阅读课本相关内容,仔细阅读示范代码。
思考题:如何实现内部提问和外部提问。
九、实验报告要求
1、实验报告中应包括相关操作步骤和程序代码和运行效果截图。
2.书写实验报告时要结构合理,层次分明,在分析描述的时候,需要注意语言的流畅。
代码:
1.基础实验代码:
//基础实验 运行环境Visual Studio 2017
//在Visual C++ 6.0 上运行时,在环境配置好的情况下,把#include"pch.h"删除即可
#include "pch.h"
#include
#include //需要正确安装Glut
void myDisplay(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);//将清空颜色设置为黑色
glClear(GL_COLOR_BUFFER_BIT);//将窗口颜色设置为当前清空颜色;
glColor3f(1.0f, 1.0f, 0.0f);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);//画一个矩形,参数指的是:对角线上两点的横纵坐标;
glBegin(GL_TRIANGLES);//画出三角形
glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.8f, -0.5f);
glColor3f/*品红色*/(1.0f, 0.0f, 1.0f); glVertex2f(-0.8f, -0.5f);
glEnd();
glPointSize(2);//数字3指示:点的大小
glBegin(GL_POINTS);
glColor3f/*红色*/(1.0f, 0.0f, 0.0f); glVertex2f(-0.4f, -0.4f);
glColor3f/*绿色*/(0.0f, 1.0f, 0.0f); glVertex2f/*指示中心点*/(0.0f, 0.0f);
glColor3f/*蓝色*/(0.0f, 0.0f, 1.0f); glVertex2f(0.4f, 0.4f);
glEnd();
glFlush();//保证前面的OPengl命令立即执行,而不缓冲等待
}
int main(int argc,char *argv[])//带命令行参数的main函数
{
glutInit(&argc, argv);//对GLUT进行初始化; glut开头的函数,全部是由GLUT工具包所提供的函数;
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示方式,前者指:使用REG颜色,后者指:使用单缓冲;
glutInitWindowPosition(100, 100);//设置窗口在屏幕中的位置;
glutInitWindowSize(800, 800);
glutCreateWindow("hello World!");//提供窗口标题
glutDisplayFunc(&myDisplay);//画图函数的调用
glutMainLoop();//显示窗口
return 0;
}
2.升级版本1
#include "pch.h"
#include
#include
void myDisplay(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);//清空为黑色
glClear(GL_COLOR_BUFFER_BIT);//将当前清空色设置为窗口颜色
glColor3f(1.0f,1.0f,1.0f);
glRectf(-0.8f,-0.8f,0.8f,0.8f);//画一个矩形
//画一个大三角形
glBegin(GL_TRIANGLES);
glColor3f(0.0f,1.0f,0.0f); glVertex2f(-0.8f,0.8f);
glColor3f(1.0f,0.0f,0.0f); glVertex2f(0.0f,-0.8f);
glColor3f(1.0f,1.0f,0.0f); glVertex2f(0.8f,0.8f);
glEnd();
//左下角三角形
glBegin(GL_TRIANGLES);
glColor3f/*品红*/(1.0f, 0.0f, 1.0f); glVertex2f(-0.6f, -0.6f);
glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(-0.55f, -0.5f);
glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.5f, -0.6f);
glEnd();
//右下角三角形
glBegin(GL_TRIANGLES);
glColor3f/*黄*/(1.0f, 1.0f, 0.0f); glVertex2f(0.5f, -0.6f);
glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.55f, -0.5f);
glColor3f(1.0f, 0.0f, 1.0f); glVertex2f(0.6f, -0.6f);
glEnd();
//画圆形(此部分代码来自csdn博客)
int i = 0;
int n = 1000;
float R = 0.52f;
float PI = 3.1415926f;
//glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 0.0f,1.0f);//设置圆形的颜色
glBegin(GL_POLYGON);
for (i = 0; i < n; i++)
{
glVertex2f(R*cos(2 * PI*i / n), R*sin(2 * PI*i / n));//通过数学计算定义顶点
}
glEnd();
//绘制五角星
float r = 0.7f;//定义中心点到顶点的距离为r
glColor3f(0.0f, 0.0f, 1.0f);//蓝色
glBegin(GL_LINE_LOOP);//顺序连线
glVertex2f(-1*r*cos(PI*0.1), r*sin(PI*0.1));//这五个点是有顺序的,不能乱序
glVertex2f(r*cos(PI*0.1), r*sin(PI*0.1));
glVertex2f(-1*r*cos(PI*0.3), -1*r*sin(PI*0.3));
glVertex2f(0, r);
glVertex2f(r*cos(PI*0.3),-1* r*sin(PI*0.3));
glEnd();
glFlush();
}
int main(int argc,char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(800, 800);
glutCreateWindow("Hello World!");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
3 升级版本-1
#include "pch.h"
#include
#include
void myDisplay(void)
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
//绘制外侧大矩形
glColor3f(1.0f, 1.0f, 1.0f);
glRectf(-0.8f, -0.8f, 0.8f, 0.8f);
//绘制内左侧圆形
glColor3f(1.0f, 0.0f, 1.0f);//品红色
glBegin(GL_TRIANGLES);
glVertex2f(-0.8f,0);
glVertex2f(-0.4f,0.4f);
glVertex2f(-0.4f,-0.4f);
glEnd();
//绘制内右侧圆形
glColor3f(1.0f, 1.0f, 0.0f);//黄色
glBegin(GL_TRIANGLES);
glVertex2f(0.8f, 0);
glVertex2f(0.4f, 0.4f);
glVertex2f(0.4f, -0.4f);
glEnd();
//绘制内上侧圆形
glColor3f(0.0f, 0.0f, 1.0f);//蓝色
glBegin(GL_TRIANGLES);
glVertex2f(0, 0.8f);
glVertex2f(-0.4f, 0.4f);
glVertex2f(0.4f, 0.4f);
glEnd();
//绘制内下侧圆形
glColor3f(0.0f, 1.0f, 0.0f);//绿色
glBegin(GL_TRIANGLES);
glVertex2f(0, -0.8f);
glVertex2f(-0.4f, -0.4f);
glVertex2f(0.4f, -0.4f);
glEnd();
//绘制内侧矩形
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_POLYGON);
glVertex2f(-0.4f,0);
glVertex2f(0, 0.4f);
glVertex2f(0.4f, 0);
glVertex2f(0, -0.4f);
glEnd();
glFlush();
}
int main(int argc,char *argv[])
{
glutInit(&argc, argv);//对GLUT进行初始化; glut开头的函数,全部是由GLUT工具包所提供的函数;
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示方式,前者指:使用REG颜色,后者指:使用单缓冲;
glutInitWindowPosition(100, 100);//设置窗口在屏幕中的位置;
glutInitWindowSize(800, 800);
glutCreateWindow("hello World!");//提供窗口标题
glutDisplayFunc(&myDisplay);//画图函数的调用
glutMainLoop();//显示窗口
return 0;
}
4.升级版本2-2
#include "pch.h"
#include
#include //需要正确安装Glut
void myDisplay(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);//将清空颜色设置为黑色
glClear(GL_COLOR_BUFFER_BIT);//将窗口颜色设置为当前清空颜色;
glColor3f(1.0f, 1.0f, 1.0f);
glRectf(-0.8f, -0.8f, 0.8f,0.8f);
//绘制红色菱形的上部
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_POLYGON);
glVertex2f(0,0.7f);
glVertex2f(0.2f, 0.35f);
glVertex2f(0, 0);
glVertex2f(-0.2f, 0.35f);
glEnd();
//红色下部
glBegin(GL_POLYGON);
glVertex2f(0, -0.7f);
glVertex2f(0.2f, -0.35f);
glVertex2f(0, 0);
glVertex2f(-0.2f, -0.35f);
glEnd();
//红左侧
glBegin(GL_POLYGON);
glVertex2f(-0.7f, 0);
glVertex2f(-0.35f, 0.2f);
glVertex2f(0, 0);
glVertex2f(-0.35f, -0.2f);
glEnd();
//红右侧
glBegin(GL_POLYGON);
glVertex2f(0.7f, 0);
glVertex2f(0.35f, 0.2f);
glVertex2f(0, 0);
glVertex2f(0.35f, -0.2f);
glEnd();
//绿色右上部分
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_POLYGON);
glVertex2f(0.35*sqrt(2),0.35*sqrt(2));
glVertex2f(0.2f, 0.35f);
glVertex2f(0, 0);
glVertex2f(0.35f, 0.2f);
glEnd();
//右下角
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_POLYGON);
glVertex2f(0.35*sqrt(2),-1* 0.35*sqrt(2));
glVertex2f(0.2f, -0.35f);
glVertex2f(0, 0);
glVertex2f(0.35f, -0.2f);
glEnd();
//左下角
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_POLYGON);
glVertex2f(-1*0.35*sqrt(2), -1*0.35*sqrt(2));
glVertex2f(-0.2f, -0.35f);
glVertex2f(0, 0);
glVertex2f(-0.35f, -0.2f);
glEnd();
//左上角
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_POLYGON);
glVertex2f(-1*0.35*sqrt(2), 0.35*sqrt(2));
glVertex2f(-0.2f, 0.35f);
glVertex2f(0, 0);
glVertex2f(-0.35f, 0.2f);
glEnd();
glFlush();//保证前面的OPengl命令立即执行,而不缓冲等待
}
int main(int argc, char *argv[])//带命令行参数的main函数
{
glutInit(&argc, argv);//对GLUT进行初始化; glut开头的函数,全部是由GLUT工具包所提供的函数;
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示方式,前者指:使用REG颜色,后者指:使用单缓冲;
glutInitWindowPosition(100, 100);//设置窗口在屏幕中的位置;
glutInitWindowSize(800, 800);
glutCreateWindow("hello World!");//提供窗口标题
glutDisplayFunc(&myDisplay);//画图函数的调用
glutMainLoop();//显示窗口
return 0;
}
实验结果展示部分就是实验报告所要求的,不再重复上图!