当前位置:
文档之家› 用OpenGL绘制一个简单图形
用OpenGL绘制一个简单图形
“什么也不做”
发生事件(单击鼠标、按下键盘
上的按键,重新调整窗口的大小)
产生特定事件消息
k q m
系统自动管理事件队
列(先到先服务)
左
程序员编写事件处 理函数 程序员将事件处理 函数注册到系统中
系统自动调
用处理函数 在队列中移 走事件消息 恢复等 待状态 k
左
q m 键盘响应函数 鼠标响应函数
事件发生
glutDisplayFunc(renderScene);
//创建菜单(以控制颜色) glutMainLoop(); … …
}
int _tmain(int argc, _TCHAR* argv[]){
… …
glutDisplayFunc(renderScene); glutCreateMenu(processMenuEvents);
四个方向运动
八个方向运动
四连通区域
八连通区域
表示内点
表示边界点
? ? ? ? ?
?
? ?
边界表示的4连通区域的递归填充算法:
void BoundaryFill4(int x,int y,int boundarycolor,int newcolor) { int color; if(color!=newcolor && color!=boundarycolor) { drawpixel(x,y,newcolor); BoundaryFill4 (x,y+1, boundarycolor,newcolor); BoundaryFill4 (x,y-1, boundarycolor,newcolor); BoundaryFill4 (x-1,y, boundarycolor,newcolor); BoundaryFill4 (x+1,y, boundarycolor,newcolor); } }
glLoadIdentity(); glBegin(GL_TRIANGLES); glVertex3f(-0.5,-0.5,0.0); glVertex3f(0.5,0.0,0.0); glVertex3f(0.0,0.5,0.0); glEnd(); glutSwapBuffers(); }
int _tmain(int argc, _TCHAR* argv[])
多边形的区域填充
扫描线算法
8 7 6 5 4 3 2
P6(2,7) A
F B P5(5,5) C
P4(11,8) G D
P3(11,3) P1(2,2) P2(5,1) 0 1 2 3 4 5 6 7 8 9 10 11 E
1
一个多边形与若干扫描线
扫描线算法
基本思想:
• 按扫描线顺序,计算扫描线与多边形的相交区间, 再用要求的颜色显示这些区间的象素,即完成填充 工作。
glEnd();
glBegin(GL_LINES); glVertex3f(-0.5,-0.5,0.0); glVertex3f(0.5,0.0,0.0);
绘制线段
效率低!
glEnd();
glBegin(GL_LINES);
glVertex3f(0.0,0.5,0.0);
glVertex3f(0.0,0.0,0.5);
《计算机图形学基础》
第三讲 用OpenGL绘制一个简单图形 刘永进
关于2015年国庆节放假及课程安排有关事宜
的通知
原排在10月5日(星期一)的课程停上,所
缺课时不补
光栅图形学
基本原理
扫描转换(直线、圆弧) 反走样
光栅图形学
基本原理
扫描转换(直线、圆弧) 反走样 区域填充
OpenGL GDI
int _tmain(int argc, _TCHAR* argv[]) { return 0; } glutInit(&argc, (char**) argv); //该函数初始化工具包, //其参数是传送有关命令行信息的标准参数, //这里不会用到它们
int _tmain(int argc, _TCHAR* argv[])
安装并运行Microsoft Visual Studio 2008 (Team Edition, Version 9.0)
选择 File New Project
选择 Win32 及对应的Win32 Console Application
输入程序名称xxx,OK后生成一个“什么也不做”
glBegin(GL_TRIANGLES);
glVertex3f(-0.5,-0.5,0.0); glVertex3f(0.5,0.0,0.0);
glVertex3f(0.0,0.5,0.0);
glEnd(); glutSwapBuffers();
}
int _tmain(int argc, _TCHAR* argv[]) { … …
//注册回调函数processMenuEvents
glutAddMenuEntry("Red",RED); //在菜单中添加选项
glutAddMenuEntry("Blue",BLUE);
glutAddMenuEntry("Green",GREEN); glutAddMenuEntry("White",WHITE);
float red=1.0, blue=1.0, green=1.0; void renderScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glColor3f(red, green, blue);
glEnd();
… …
绘制线段
glBegin(GL_LINES);
glVertex3f(-0.5,-0.5,0.0); glVertex3f(0.5,0.0,0.0); glVertex3f(0.0,0.5,0.0); glVertex3f(0.0,0.0,0.5); … … glEnd();
OpenGL编程指南 第八版
光栅图形学
直线的扫描转换=>
多边形的封闭区域
区域填充
区域填充算法
区域指已经表示成点阵形式的填充图形, 它是象素的集合。 区域填充指先将区域的一点赋予指定的颜 色,然后将该颜色扩展到整个区域的过程。 区域填充算法要求区域是连通的 区域可分为4向连通区域和8向连通区域。
4向连通区域和8向连通区域
Depth buffer
int _tmain(int argc, _TCHAR* argv[])
{
… … glutDisplayFunc(renderScene); //向系统注册重新绘制事件处理函数 }
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
使用GLUT支持库!
程序的开始处添加:
#include<gl/glut.h> #include<gl/glu.h>
#include<gl/gl.h>
一个能运行、最简单的OpenGL程序!
增加颜控制:
glColor3f(red, green, blue);
在程序的开头定义:
float red=1.0, blue=1.0, green=1.0;
{
glutInit(&argc, (char**) argv); glutInitDisplayMode(GLUT_DEPTH |
GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100); glutInitWindowSize(320,320); glutCreateWindow("Yong-Jin Liu 15 Fall Course"); }
{
… … glutDisplayFunc(renderScene); //向系统注册重新绘制事件处理函数 glutMainLoop(); //enters the GLUT event processing loop. }
第一个OpenGL程序
Windows系统下的事件/消息驱动机制
程序运行,
进入等待状态,
第一步:预处理
opengl32.lib glut32.lib glu32.lib include 头文件 <gl/glut.h> <gl/glu.h> <gl/gl.h>
实例演示
第一步: 安装并运行Microsoft Visual Studio 2005
(Team Edition, Version 8.0)
参数:GL_POINTS, GL_LINES, GL_POLYGON, GL_TRIANGLES
绘制点
glBegin(GL_POINTS); glVertex3f(-0.5,-0.5,0.0); glVertex3f(0.5,0.0,0.0); glVertex3f(0.0,0.5,0.0);
… …
case BLUE : red = 0.0; green = 0.0; blue = 1.0; break;
case WHITE : red = 1.0; green = 1.0; blue = 1.0; break; }
glutPostRedisplay();
}
添加动画:
可以在glutIdleFunc(函数指针参数)函数中指定一个函数, 如果不存在其它尚未处理的事件(也就是事件循环处于空闲 的时候),就执行这个函数。