计算机图形学用OpenGL画出矩形三角形和点

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机图形学实验报告

实验1 OpenGL初识

1.实验目的

熟悉编程环境;了解光栅图形显示器的特点;了解计算机绘制图形的特点;利用VC+OpenGL 作为开发平台设计程序,以能够在屏幕上生成任意一个像素点作为本实验的目标

2.实验内容

(1) 了解和使用vc的开发环境,理解简单的OpenGL程序结构

(2) 掌握OpenGL提供的基本图形函数,尤其是生成点的函数

3.实验原理

(1)基本语法

OpenGL基本函数均使用gl作为函数名的前缀;为了便于移植,OpenGL定义了一些自己的数据类型

(2)程序的基本结构

OpenGL程序的基本结构可以分为三个部分,第一部分是初始化部分,主要是设置一些OpenGL的状态开关,如颜色模式的选择,是否作光照处理,深度检测,裁剪等;第二部分设置观察坐标系下的取景模式和取景框位置大小;第三部分是OpenGL的主要部分,使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系、几何变换和光照处理等。

(3)状态机制

OpenGL的工作方式是一种状态机制,它可以进行各种状态或模式设置,这些状态或模式在重新改变它们之前一直有效。例如,当前颜色就是一个状态变量,在这个状态改变之前, 绘制的每个像素都将使用该颜色, 直到当前颜色被设置为其他颜色为止。OpenGL 中大量使用了这种状态机制,如颜色模式、投影模式、单双显不1缓存区的设置、背景色的设置、光源的位置和特性等。许多状态变量可以通过glEnable0、glDisable0这两个函数来设置成有效或无效状态, 如是否设置光照、是否进行深度检测等; 在被设置成有效状态之后,绝大部分状态变量都有一个默认值。通常情况下,可以用下列四个函数来获取某个状态变量的值: glGetBooleanv、glGetDouble.、. glGetF1oatv 和glGetIntegerv。究竟选择哪个函数应该根据所要获得的返回值的数据类型来决定。还有些状态变量有特殊的査询函数, 如glGetLight*、glGetError和glPolygonStipple等。另外,使用glPushAttrib和glPopAttrib函数,可以存储和恢复最近的状态变量的值。只要有可能,都应该使用这些函数,因为它们比其他査询函数的效率更局。

4.实验代码

#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.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(0.0f,0.0f,1.0f); glVertex2f(-0.8f,-0.5f);

glEnd();

glPointSize(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();

}

int main(int argc, char *argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutInitWindowPosition(100,100);

glutInitWindowSize(400,400);

glutCreateWindow("Hello world!");

glutDisplayFunc(&myDisplay);

glutMainLoop();

return 0;

}

5.实验提高

#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.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(0.0f,0.0f,1.0f); glVertex2f(-0.8f,-0.5f);

glEnd();

glPointSize(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();

glBegin(GL_LINES);

glVertex2f(0.0f,-0.5f);

glVertex2f(-0.4f,0.25f);

glEnd();

glBegin(GL_LINES);

glVertex2f(0.0f,-0.5f);

glVertex2f(0.4f,0.25f);

glEnd();

glBegin(GL_LINES);

glVertex2f(-0.4f,0.25f);

glVertex2f(0.4f,0.25f);

glEnd();(多加了这些红色的代码,这些是加线条的代码)

glFlush();

}

int main(int argc, char *argv[])

相关文档
最新文档