4_1图元的属性
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4
颜色和灰度
颜色是所有图元的一个基本属性。 颜色用颜色编码表示, 对于监视器,颜色编码可转换为控制电子 束的强度等级,对于绘图仪,可用来控制 喷墨量或笔的选择。
5
彩色光栅系统中,可选用的颜色数量依赖 于帧缓存中提供的存储容量。 灰度:当RGB函数中指定相同量的红,绿 ,蓝色时,结果是某种程度的灰度。靠近0 的值生成暗灰色,靠近1的生成亮灰色。如 glColor3f(0.3,0.3,0.3) 颜色可用两种方式存储在帧缓存中:
符号组。
揩体
宋体 Times Roman 黑体
所选字体的字符也可用附加的下横线风格、黑体、斜体 、轮廓或影
线风格。 颜色
显示文本的颜色设置存储在系统属性表中并由软件函数来控制管理。
字符大小
调整文本大小可通过缩放字符的整体尺寸(高度和宽度),或仅缩 放字符宽度来实现。
直接存RGB编码 颜色码存入一个独立的表中,并在像素位置指
向颜色表表项的索引。
6
8
8
8位DAC
8
8位DAC
8位DAC 红 绿 蓝
CRT光栅
图 具有24位面彩色帧缓存的显示器
对于1024×1024的分辨率,真彩色/全色(每个像 素占24位)RGB系统需要帧缓冲器的存储量: 1024×1024×24 bit=3M byte。
9
设置当前颜色属性
glColor*(colorComponents) 如:glColor3f(1.0,1.0,1.0);
如: glColor3f(1.0,1.0,1.0,1.0);
如:glcolor3i(0,255,255);
任何格式指定的颜色值都要按比例转换成特定 系统有效位所确定的范围中的整数。
相同大小的不同字体按其字体的不同有不同大小
在指定大小的一种字体中的所有字符的底线和顶线间的距离
是相同的,但字符体的宽度可能不同:
窄字符i、j、l和f的字符体宽度要比宽字符W或M来得小。
字符高度被定义为字符基线(Baseline)和帽线(Capline)间的
距离,像f和j这样的有核字符通常超出字符体的限制,下行字 符(g,j,p,q,y)要超出基线以下。
34
曲线属性
曲线属性的参数与线段相同。 可以使用各种颜色,宽度,点划线模式和 有效的画笔和笔刷选择来显示曲线。
35
OpenGL点属性函数
指定点的大小: glPointSize(size); 缺省为一个像素的点 glPointSize(3) 表示三倍尺寸的点,现在 是3*3的像素大小的的方块了。
22
线刷子和方刷子处理线宽
线刷子:垂直刷子、水平刷子
(a)
(b)
图5-39
线刷子
23
特点 实现简单、效率高。
斜线与水平(或垂直)线不一样粗。
当线宽为偶数个象素时,线的中心将偏移半个象素。
利用线刷子生成线的始末端总是水平或垂直的,看起
来不太自然。
解决:添加“线帽(line cap)”
36
线属性函数
设定线宽 glLineWidth(width) 设定线型 glLineStripple(repeatFactor,pattern);//pattern是16 位整数,值为1的位对应一个‘开’像素,值为0的 对应一个‘关’像素。repeatFactor,表示每一位重 复多少 如glLineStripple(1,0x00FF);//虚线 激活/关闭线型特性 glEnable(GL_LINE_STRIPPLE); glDisable(GL_LINE_STRIPPLE);//恢复默认实线取 37 代当前线型
内容提要
图元属性
颜色和灰度
点属性 直线属性 曲线属性 填充区域属性(x) 字符属性
1
输出图元属性
属性参数(attribute parameter) • 把影响图元显示方法的参数称为属性参数。诸如
颜色和大小。
• 例如:线段可以是点线、粗线或细线,以及蓝色
或橙色等颜色。区域可以使用一种颜色或多色填
18
可以通过添加“线帽”来调 整线端的形状以给出较好的 外观,
线帽有方帽、圆帽和突方帽。 方帽通过调整所构成平行线 的端点位置,使粗线的显示 具有垂直于线段路径的正方 形端点。假如指定线的斜率m, 则粗线的方端的斜率-1/m。
19
生成粗线的其它方法包括将显示线段看作 填充长方形,或用选定的笔或刷样式来生 成线段。 生成粗折线需要一些额外的处理。通常, 显示单根折线段所用的方法不能生成光滑 连接的折线段。我们可通过在线段端点进 行额外处理来生成光滑连接的粗折线。
填充区属性
多数图形软件包把填充区定义为多边形, 而且要求是一个凸多边形。但也提供对任 意形状区域的交互式填充功能。 有两种填充:-下次课重点讲
扫描线填充 种子点填充
38
字符图元属性
字体
字体从一组预先定义的网格图案或一些用多边形和样条曲线设计的字符
集中选择,
揩体、宋体和Times Roman等特定设计风格的一组字符和一些特殊
33
y 12 11 10 9 8 7 6 5 4 3 b 2 1 a 1 2 3 4 5 6 7 8 910 11 12 x
图
相同数目象素显示的不等长划线
存在问题:如何保持任何方向的划线长度近似地相等
解决:可根据线的斜率来调整实心段和中间空白段的象素数
24
(a)方帽
(b)突方帽
(c)圆帽
图
线“帽子”
25
当比较接近水平的线与比较接近垂直的线汇合时, 汇合处外角将有缺口
图
Hale Waihona Puke 线刷子产生的缺口26
解 决 : 斜 角 连 接 ( miter join)、 圆 连 接 ( round join)、斜切连接(bevel join)
(a)斜角连接
16
对于斜率绝对值大于1的 粗线,可以在水平段交 替地画线段路径左边和 右边像素形成粗线 如图,其线宽为4,用水 平线绘制。
17
复制象素法缺点 尽管通过绘制水平段或垂直段能快速地生 成粗线,但线的显示宽度(垂直于线段路径 测量)仍取决于线的斜率。如:同样线宽, 45o线的显示线宽只有垂直线或水平线的根 号二分之一宽。 不管斜率多少,所生成线段的端点是水平 或垂直的。这对于较粗的线的影响更突出。
} }
15
对于斜率绝对值小于1的线,可 修改画线程序,通过在沿线的每 个x位置画像素的垂直段来显示 粗线。每段的像素数目等于线宽 的整数值。 通过在原线段路径之上生成一条 平行线而画出了双倍线宽的线段。 在每个位置x处,计算对应的y坐 标,并使用屏幕坐标(x,y)和 (x,y+1)画像素。 通过交替地在单线宽度的上下画 像素就可以显示线宽≥3的粗线
29
Line style
线型属性可能包括实线、虚线和点线等。 通过设置沿线路径显示的实线段的长度和 间距来修改画线算法,以生成各种类型的 线。
虚线可通过在实线段间插入与实线段等长的空
白段来显示;画线的长度和空白段长度常作为 用户的选项来指定。 点线,可通过生成很短的画线和等于或大于画 线大小的空白段来显示
7
w位查找表 2 n 表项
n
帧缓冲存储器 2 w 级DAC 2 为总光强等级 2 n 为每次可显示的光强等级
w `
电子抢
CRT光栅
图2-8 具有N位帧缓存和W位颜色查找表的光栅显示器
8
设定颜色显示模型
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB) GLUT_RGB:RGB模型 GLUT_RGBA:多了个参数A用来控制图元重 叠时的颜色调和,应用是模拟透明效果。 GLUT_INDEX:颜色索引模式.
14
void lineBres(int xa,int ya,int xb,int yb) { int dx=xb-xa,dy=yb-ya,p=2*dy-dx; int twoDy=2*dy,twoDyDx=2*(dy-dx), x,y,xEnd; x=xa;y=ya; xEnd=xa; setpixel(x,y,RED); while(x<xEnd){ x++; if(p<0) p+=twoDy; else{ y++; p+=twoDyDx }; setpixel(x,y,RED); setpixel(x,y+1,RED); setpixel(x,y-1,RED);
20
图显示出了两线段光滑连接的三种 可能方法: 斜角连接通过延伸两条线的外边界 直到它们相交来完成。 圆连接通过用直径等于线宽的圆弧 边界将两线段间连接而成。 斜切连接则是通过用方帽和在两线 段相交处的三角形间歇中填充来生 成
21
Line Width -2 、移动画笔法
有些图形软件包中,线可选择笔或刷的方 式来显示。选项包括形状、尺寸和式样。 如图显示的可能的笔和刷形状。这些形状 可以以像素位置数值形式存储在一个像素 模板中,在必要时设置到线段路径上。 例如图显示的是一个长方形笔的像素模板, 用这个模板的中心沿线段路径就可画出相 应宽度的线来 通过改变笔或刷的像素模板的尺寸,则使 用该模板的笔或刷来生成的线段就可以有 不同的宽度
ijlf MW
abcdilfgjqyfj
字符方向和路径
方向:字符串显示方向按字符向上向量的方向设置
文本以字符基线到帽线的向上矢量的方向显示。
10
1 )点属性
颜色color 大小size 颜色和大小都由存放在属性表的当前值确 定。 颜色分量用RGB值或颜色表的索引值设定。 点的大小是像素大小的整倍数,显示为一 个像素方块。
11
2) 线属性
颜色color 线型style 线宽width
颜色可用对所有图元相同的函数设定,而 线宽和线型用单独的线函数选择。
30
1. 线型处理style
实心段和中间空白段的长度(象素数目)
可用象素模板(pixel mask)指定------称为位
屏蔽器。
例如:可用16位的整数表示一个位串,
31
在用程序实现时,只
Putpixel(x,y,color)
改写成
If(线型位串[i%16]) Putpixel(x,y,color)
充图案。文本可以从左到右的阅读方式进行显示
2
• 将属性加入图形软件包的方法:
1)为每个输出图元功能扩充相关的参数表,从
而包含合适的属性。如setpixel(x,y,color).
2)提供一张系统当前属性值表,并使用包含在图 形软件包中的独立函数来为属性表设置当前值 。(共享方式)
3
OpenGL等图形库采用第2种方式,即更新 系统属性表的独立函数来设定属性。 OpenGL的所有图元使用当前状态表中的 属性显示。 在给定一个或几个参数赋值时候,系统进 入一个特定状态,该状态一直保留到状态 参数的值再次改变。(状态机模型)
(b)圆连接
(c)斜切连接
图
线刷子产生的缺口
27
方刷子
图
方刷子
特点: 方刷子绘制的线条(斜线)比用线刷子所绘制的线 条要粗一些 方刷子绘制的斜线与水平(或垂直)线不一样粗 方刷子绘制的线条自然地带有一个“方线帽”
28
Line Width -3 区域填充法
可以根据线条的宽度,计算出线条的外轮 廓,然后调用填充图元的生成函数将其填 充,产生具有一定线宽的线条。 填充方法下章讲
i: 循环变量,每处理一个象素递增
32
线型例子
用一个8位的整数表示一个位串,用它控制线 型时,必须以8个像素为周期进行重复。 Patten=11010101 画线程序中的 SETPIXEL(X,Y,COLOR) 改写为 If(pattern[i%8]) setixel(x,y,color);
12
Line Width
常用线宽的控制方法有
复制象素法 移动画笔法 区域填充法
13
Line Width -1、复制象素法
线宽选择的实现取决于输出设备的能力。 在视频显示器上的粗线可以用相邻的平行 线来显示。 在光栅实现中,标准线宽是用Bresenham 算法那样在每个取样位置处用一个像素来 生成。其它宽度是作为标准线的正整数倍 通过沿相邻平行线路径画额外的像素而显 示的。