ZZU的学弟学妹们不要抄作业哦~(`Д´)
一、实验目的
1.了解和掌握OpenGL的安装。
2.掌握一个简单的基于OpenGL的C++程序结构。
3.掌握win32程序框架。
4.掌握OpenGL中若干基本图形的绘制。
二、实验内容
1.准备好OpenGL库文件。
- Glut32.dll路径为%system root&\SysWOW64。
- Glut32.lib路径为PATH\lib。
- Glut.h路径为PATH\Include。
- System root为Windows安装路径
- PATH为Visual Studio安装路径。
2.建立一个工程文件,并运行样本程序my_first_program.cpp,观看结果。
1)启动Microsoft Visual Studio,在菜单栏中单击“文件”→“新建”→“项目”,如实验图1-1所示。
(实验图1-1 新建项目)
2)在“新建项目”对话框中选择“Windows桌面向导”(书上的联机模板找不到),然后输入项目名称和保存位置,如实验图1-2所示,单击“确定”按钮。
(!!!!注意!!!我的实验一、二、三、六用的是Windows桌面向导,但是后面的其他实验都是创建的Windows桌面应用程序!创建的项目及头文件会有所不同!!! 可以看这个:OpenGL的创建)
(图1-2)
- 创建一个C++源文件并输入样本程序(1-3)。
//样本程序 my_first_program.cpp
#include<glut.h>
#include<stdio.h>
#include<windows.h>
void display(void)
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//设置清屏颜色
glClear(GL_COLOR_BUFFER_BIT);//刷新颜色缓存区
glFlush();//刷新命令队列和缓存区,是所有尚未执行的OpenGL命令得到执行
}
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
char *argv[] = {"hello "," " };
int argc = 2;
glutInit(&argc, argv); //初始化GLUT库;
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置显示模式;(缓冲,颜色类型)
glutInitWindowSize(500, 500);//绘制窗口大小
glutInitWindowPosition(1024 / 2 - 250, 768 / 2 - 250);//窗口左上角在屏幕的位置
glutCreateWindow("hello"); //创建窗口,标题为“hello”;
glutDisplayFunc(display); //显示回调函数用于绘制当前窗口;
glutMainLoop(); //表示开始运行程序,用于程序的结尾;
return 0;
}
//以上样例的运行结果是创建一个名为“hello”的窗口,如实验图1-4所示。
(图1-4 hello窗口)
3.认真阅读以上样本程序,理解每个函数的作用,并修改窗口标题,让其显示为“我的第一个OpenGL程序”。如图1-5所示。
(图1-5 我的第一个OpenGL程序)
4.窗口设置。
在默认情况下,窗口的出现位置在屏幕的左上角,大小为300X300。
要求:
1)修改窗口位置,使之处于屏幕中央。
2)将窗口大小修改为整个屏幕大小。
3)修改窗口大小为其他尺寸。
参考函数:
glutInitWindowsPosition(int x,int y);
//为窗口指定初始位置,窗口左上角在屏幕的位置为(x,y)
//如果不写该函数,或者写成“glutInitWindowsPosition(0,0);”均表示窗口的位置出现在屏幕左上角
glutInitWindowsPosition(int width,int height);//设置窗口大小
//如果不写该函数,表示窗口大小默认为300X300
5.背景颜色设置
在默认情况下,背景颜色是黑色。
要求:
1)将窗口颜色设置为白色,如图1-6
(图1-6 白色背景)
2)将窗口颜色设置为其它颜色,灰色(0.5,0.5,0.5,0),如图1-7
(1-7 灰色背景)
参考函数:
glClearColor(float r, float g, float b, float alpha);//设置背景,次函数放在display()中,并且放在glClear(GL_COLOR_BUFFER_BIT);前面
其中r,g,b取值范围是[0,1],可以是浮点数;alpha取值范围为[0~1],在这里其值不起作用,以后再讨论该参数。
例如glClearColor(0,0,0,0)为黑色背景,glClearColor3f(1,1,1,0)为白色背景,其他颜色应该如何设置请读者思考。
6,基本图形绘制
绘制函数一般放置在清屏语句
glClear(GL_COLOR_BUFFER_BIT);//刷新颜色缓存区
和刷新语句
glFlush();//用于刷新命令队列和缓存区,是所有尚未被执行的OpenGl命令得到执行。
之间
矩形绘制:
1)在display绘图函数的“glClear(GL_COLOR_BUFFER_BIT);”1语句后面增加“glRectf(0,0,1,1);”,运行程序查看效果,如图1-8所示。
(图1-8 矩形绘制)
- 修改矩形的对角坐标,看看有什么变化和问题,如图1-9所示。
(0.2, 0.3, 0.4, 0.5)
(图1-9 矩形坐标改变)
3)根据给出的函数,试画出直线和三角形等基本图形。
//绘制直线
glBegin(GL_LINES);
glVertex2f(0,0);
glVertex2f(0.8,0.8,0);
glEnd();
//画三角形,x1,y1,x2,y2,x3,y3为三角形定点坐标
glBegin(GL_TRIANGLES);
glVertex2f(0,0);
glVertex2f(0.5,0.5);
glVertex2f(0.0,0.8);
glEnd();
图形分别如图1-10和图1-11所示。
(图1-10 直线绘制)
(1-11 三角形绘制)
7,绘图色的设置
1)将绘制的图形修改成红色,如图1-12所示。
(1-12 红色矩形)
2)将绘制的不同基本图元设为不同的颜色,如实验图1-13所示。
(1-13 三角形绘制)
参考参数:
glColor3f(r,g,b);//设置绘图色r,g,b取值范围为[0,1],可以为浮点数。
例如:
glColor3f(1,0,0);//设置为红色
glColor3f(0,1,0);//设置为绿色
glColor3f(0,0,1);//设置为蓝色
其他绘图颜色应如何设置请读者思考。
8.绘制几何图形
1)更改标题栏,加上学号,姓名。
2)绘制两个以上基本几何形状。
3)设置三种颜色,如图1-14。
三、思考题
1.默认窗口位置在屏幕的什么位置?如果要改变窗口在屏幕的位置应该如何处理?如何改变窗口大小?
答:默认窗口在屏幕的左上角;若要改变窗口在屏幕的位置应使用glutInitWindowsPosition(int x,int y)函数,在x和y处修改窗口左上角的坐标;改变窗口大小用glutInitWindowSize(int width, int height)函数,在wide和height处修改窗口的宽和高。
2.本实验中默认的绘图坐标原点在窗口的什么位置?
答:在窗口中心。
3.如何修改背景颜色和绘图颜色?绘图颜色的顺序和位置有什么要求?
答:修改背景颜色用glClearColor(float r, float g, float b, float alpha)函数,修改r,g,b的值。颜色写在要在位置之前。
4.对于“#include<glut.h>”,头文件glut.h放在哪个文件夹下?
答:在:\packages\nupengl.core.0.1.0.1\build\native\include下。
5.图形函数的顺序与位置有什么要求?试改变程序中一些图形函数的顺序,看运行结果是否有改变。
答:如果坐标冲突的话,后画的图形会覆盖先画的图形。
四、完整代码
//样本程序
#include<glut.h>
#include<stdio.h>
#include<windows.h>
void display(void)
{
glClearColor(0,0,0,0);//设置清屏颜色
glClear(GL_COLOR_BUFFER_BIT);//刷新颜色缓存区
glColor3f(0.7, 0.2, 0.3);
glRectf(0.3, 0.3, 0.7, 0.7);
glBegin(GL_LINES);
glVertex2f(0.5, 0.5);
glVertex2f(-0.8, 1);
glEnd();
glColor3f(0.5, 0.5, 0.3);
glBegin(GL_TRIANGLES);
glVertex2f(-1, -1);
glVertex2f(-0.6, -0.3);
glVertex2f(0, 0);
glEnd();
glColor3f(0.1, 0.2, 0.3);
glBegin(GL_TRIANGLES);
glVertex2f(0, 0);
glVertex2f(-0.5, -0.5);
glVertex2f(0.0, 0.8);
glEnd();
glFlush();//刷新命令队列和缓存区,是所有尚未执行的OpenGL命令得到执行
}
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
char *argv[] = { "hello "," " };
int argc = 2;
glutInit(&argc, argv); //初始化GLUT库;
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置显示模式;(缓冲,颜色类型)
glutInitWindowSize(500, 500);//绘制窗口大小
glutInitWindowPosition(1024 / 2 - 250, 768 / 2 - 250);//窗口左上角在屏幕的位置
glutCreateWindow("201684G0214刘克楠"); //创建窗口,标题为“hello”;
glutDisplayFunc(display); //显示回调函数用于绘制当前窗口;
glutMainLoop(); //表示开始运行程序,用于程序的结尾;
return 0;
}