《计算机图形学OpenGL基本图元的绘制》由会员分享,可在线阅读,更多相关《计算机图形学OpenGL基本图元的绘制(46页珍藏版)》请在金锄头文库上搜索。
1、Lecture 6OpenGL基本图元的绘制 概述概述图元的种类:点、线段、多边形、矩形OpenGL中所有的实体最终都可采用一系列有序的顶点描述。 二维图形是三维图形的特殊情况(z分量为0),在三维顶点 绘制指令中,如果用户设定二维坐标(x, y),OpenGL 就会自动令z=0 OpenGL提供的描述点、线、多边形的绘制机制。必须通过 glBegin()和glEnd()函数配对来完成. OpenGL的程序结构(6_1)auxInitDisplayMode(AUX_SINGLE|AUX_RGBA)设置 窗口显示模式为RGBA方式,即彩色方式,并且图形缓 存为单缓存(SINGLE BUFFER)
2、。auxInitPosition(0,0,500,500)定义窗口的初始位置,前 两个参数(0,0)为窗口的左上角点的屏幕坐标,后两个参 数(500,500)为窗口的宽度和高度。auxInitWindow(“AUX_SAMPLE“)是窗口初始化,字符 参数是窗口名称。OpenGL的程序结构(6_1)auxReshapeFunc()和auxMainLoop(),参数都是一个 函数指针,指向的都是回调函数(回调函数定义用 CALLBACK说明)。auxReshapeFunc()是窗口形状重定函数,参数指针指 向函数myReshape(),它的两个参数就是窗口的新宽度和新高度。然后用glViewpo
3、rt(0,0,w,h)重定视口 ,并且在新视口内重新定义投影矩阵。AUX库显示坐标范围(6_2)设定视区的函数,即指定一个显示窗口的范围(程序6_2)void CALLBACK Reshape(GLsizei width,GLsizei height)glViewport(0,0,width,height);auxReshapeFunc(myReshape);窗口形状重定函数,参数指针指向函数myReshape(), 它的两个参数就是窗口的新宽度和新高度。auxInitPosition(0,0,500,500);初始化显示窗口的大小AUX库显示坐标范围如果使用auxReshapeFunc(my
4、Reshape);设定了窗口 形状重定函数。则显示窗口的坐标范围为11。其绘 图像的过程是把11范围的坐标点映射到屏幕坐标。如果未使用auxReshapeFunc(myReshape);设定窗口 形状重定函数。则显示窗口的坐标范围为实际窗口的尺 寸。OpenGL的状态机制OpenGL的绘图方式是由一系列的状态决定的。如果设 置了一种状态或模式而不改变它,OpenGL在绘图的过 程中将一直保持这种状态或模式。例如:Void myinit(void)glClearColor(0.0,0.0,0.0,0.0);OpenGL的状态机制其中函数glClearColor(0.0,0.0,0.0,0.0)将
5、视口背景 色清为黑色,如果不改变这种状态,视口背景色将一直 保持黑色。其他状态有:模型变换线及多边形的填充图案多边形绘制模式光源的位置及特性被绘制物体的材质等基于MFC的OpenGL编程(6_3)OpenGL辅助函数库提供了一些窗口和事件管理函数, 但提供的功能有限。而MFC却提供了大量对窗口和事件 管理和控制的函数。图形操作描述像素格式图形操作描述每一个Windows程序都必须设置设备描述表DC( Device Contexts),DC包含了窗口上显示图形的诸多 信息,例如:指定绘图模式、画笔和刷子的颜色。 OpenGL的Windows程序也必须使用DC。OpenGL还必须处理专用的绘图描述
6、表RC(Rendering Contexts),一个OpenGL应用程序必须创建一个绘图描 述表,然后启动它,最后在所定义的窗口内按常规方式 调用OpenGL函数绘图。图形操作描述首先得到设备描述表DC(设备上下文):m_pDC = new CClientDC(this);创建绘图描述表/Create rendering contenthrc = wglCreateContext(m_pDC-GetSafeHdc();图形操作描述绘图:设置一个线程的当前绘图描述表wglMakeCurrent(m_pDC-GetSafeHdc(), hrc); DrawScene();wglGetCurrent
7、DC()得到当前设备描述表SwapBuffers(wglGetCurrentDC();释放绘图描述表所使用的设备描述表wglMakeCurrent(m_pDC-GetSafeHdc(), NULL); 像素格式在创建一个绘图描述表之前,首先必须设置设备描述表 的像素格式,像素格式含有设备绘图界面的属性:颜色模式(RGBA模式/颜色索引模式)单/双缓冲区颜色、深度、累加和模板缓冲区所用的位数像素格式PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR), / 该结构所占空间 1, / 版本号,当前为1 PFD_DRAW_TO_WINDO
8、W | / 支持windows的屏幕绘图PFD_SUPPORT_OPENGL | / 支持OpenGLPFD_DOUBLEBUFFER, / 支持双缓存 PFD_TYPE_RGBA, / 支持RGBA 颜色模式 24, / 24位颜色深度 0, 0, 0, 0, 0, 0, / 红绿蓝颜色分量和偏移量所占位数相同 0, / 无alpha分量 0, /无alpha偏移量 0, / 无累加缓冲区 0, 0, 0, 0, /忽略累加缓冲区的个分量 32, / 32位的深度缓冲区 0, / 无模板缓冲区 0, / 无辅助缓冲区 PFD_MAIN_PLANE, / WIN98、NT下只能是PFD_MAI
9、N_PLANE 0, / 保留,当前为0 0, 0, 0 / 忽略覆盖层的屏蔽 ;像素格式设定像素格式后,进行如下的操作:int pixelformat;m_pDC = new CClientDC(this);使用设备描述表选择一个像素格式pixelformat = ChoosePixelFormat(m_pDC-GetSafeHdc(), 定义顶点序列void glBegin(GLenum mode)功能:描述一个几何图元顶点序列的开始。参数说明:mode:指出图元的类型。void glEnd (void)功能:标记顶点序列的结束。 函数glVertex( ) 可定义一个点 。定义顶点序列例
10、如:绘制一个多边形边界(POLYGON):glBegin(GL_POLYGON)glVertex2f(0.0,0.0); / Vertex 0givedex2f(0.0,3.0); / Vertex 1glVedex2f(3.0,3.0); / Vertex 2alVenex2f(4.0,1.5): / Vertex 3givedex2f(3.0,0.0); / Vertex 4glVertex2f(0.0,0.0); / Vertex 0glEnd();几何图元类型和说明 几何图元类型和说明 几何图元类型(6_4) 几何图元类型 GL_POINTSGL_LINESGL_LINE_STRIPG
11、L_LINE_LOOPGL_POLYGONGL_QUADSGL_QUAD_STRIPGL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FAN几何图元类型点GL_POINTS:N个顶点V0, V1, Vn-1构成 离散的顶点序列 。在OpenGL中一个点是当作一个n维(n=2,3,4)向量 来处理的。 glVertex2f(2.0, 1.0)指定一个顶点的坐标(2.0, 1.0) ,则在实际计算中OpnGL是处理点(2.0, 1.0, 0.0) glVertex2,3,4sifd(V)(TYPE coords)参数说明:coords:用一个数组或用齐次坐标(x,
12、y, z, w)赋顶点坐标 画点的例程glBegin(GL_POINTS);glVertex3f(0.0,0.0,0.0)glVertex3f(50.0,50.0,50.0)glEND();glBegin的参数GL_POINTS告诉OpenGL,下面的顶点应 被解释并绘制为点,它们将转换为两个具体的点,并被 绘制出来,其颜色为缺省值点的属性。 点的大小 OpenGL提供了可以控制点的大小的函数。点大小的默认 值是一个像素。可以用函数glPointsize()修改这个值, 以设定点的大小:void glPointsize(GLfloat size) 直线GL_LINES:N个顶点V0, V1,
13、Vn-1每2个一组画线段,即 V0-V1,V2-V3,共计画N/2条线。若N为奇数,则第N个点Vn-1每忽略。直线的绘制 下面的代码在两个点(0,0,0)和(50,50,50)之间 画一根直线。 glBegin(GL_LINES);glVertex3f(0.0,0.0,0.0)glVertex3f(50.0,50.0,50.0)glEND();注意:在OpenGL中,参数GL_LINES对每两个指定的顶 点画一根直线。如果GL_LINES指定奇数个顶点,那么 最后一个顶点将会被忽略。 折线GL_LINE_STRIP:画一折线: V0-V1,V1-V2 ,V2-V3 , Vn-2-Vn-1 ,共
14、计N-1条线段。注意:(1)最后一点与第一点之间不连线,即不形成回路。但 当最后一点与第一点之间重合时,显示效果等同于回路 效果。(2)必须满足N1的条件,否则什么也画不出来。折线例程 图元类型: GL_LINE_STRIPglBegin (GL_LINE_STRIP);glVertex3f(0.0,0.0,0.0);glVertex3f(50.0,50.0,0.0);glVertex3f(100.0,100.0,0.0);glEnd( ); 封闭折线GL_LINE_LOOP:与上面GL_LINE_STRIP的唯一不同之 处在于: GL_LINE_LOOP的最后一个顶点与第一个顶 点之间进行连
15、线共计N条线段形成回路。封闭折线例程 图元类型: GL_LINE_LOOP glBegin (GL_LINE_ LOOP);glVertex3f(0.0,0.0,0.0);glVertex3f(50.0,50.0,0.0);glVertex3f(100.0,100.0,0.0); glEnd( ); xyxyP0(0,0,0)P1(50,50,0)P2(50,100,0)P0(0,0,0)P1(50,50,0)P2(50,100,0)线型 (6_6)为了使用点画线,必须用以下指令先启动点画线模式。void glLineStipple (GLint factor,GLushort pattern);此命令有以下参数:factor是一个