大三05计算机图形学_第1页
大三05计算机图形学_第2页
大三05计算机图形学_第3页
大三05计算机图形学_第4页
大三05计算机图形学_第5页
免费预览已结束,剩余49页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Buffers缓冲原著Ed AngelProfessor of Computer Science, Electrical and Computer Engineering, and Media ArtsUniversity of New Mexico编辑 武汉大学计算机学院图形学课程组ObjectivesIntroduce additional OpenGL buffers OpenGL的各种缓冲区Learn to read and write buffers数字图像缓冲区写入操作Learn to use blending混合操作OpenGL的位与像素操作Outline8.1 Buffer缓冲

2、区8.2 Digital Image数字图像8.3 Writing in Buffers缓存写操作8.4 Bit and Pixel Operations in OpenGL OpenGL中的位操作与像素操作8.1 Buffer缓冲区(光栅图形)在计算机图形学出现后的很长一段时间内人们处理的主要是几何对象例如:点、线、多边形光栅图形的出现已有三十多年的历史,但直到不久前,图形应用程序中也只是间接地读写帧缓冲区虽然点、线、多边形最终在写入到帧缓冲区时,要被光栅化处理,但是在图形应用程序中一般不提供函数直接读写单个像素8.1 Buffer缓冲区(现状)在过去的十年里,许多方法出现,这些方法需要直接

3、与构成帧缓冲区中的各种缓冲区打交道但是有几种方法需要直接与帧缓冲区中的像素通信例如:纹理映射、反走样、组合、融合8.1 Buffer缓冲区缓冲区都是离散的内存块已接触过两种缓冲区:颜色缓冲区 与 深度缓冲区Define a buffer by its spatial resolution (n x m) and its depth (or precision) k, the number of bits/pixel 由其空间分辨率(n x m)和深度(或精度,每个像素的位数)k确定pixel8.1 Buffer缓冲区(OpenGL Frame Buffer OpenGL的帧缓冲区)8.1 Bu

4、ffer缓冲区(各种缓冲区)各种缓冲区的空间分辨率一样,但深度值k(即表示一个像素信息的字长)可以不一样通常我们只是讨论集中在一个帧缓冲区组成部分中的一个缓冲区,因此有时就直接简称为缓冲区8.1 Buffer缓冲区(OpenGL Buffers缓冲区)Color buffers can be displayed颜色缓冲区用于显示Front前Back后Auxiliary辅助Overlay重叠Depth深度缓冲区Accumulation累加缓冲区High resolution buffer高分辨率缓冲区Stencil模板缓冲区Holds masks保存掩码8.1 Buffer缓冲区(颜色缓冲区)内

5、容要被输出到显示设备上的缓冲区在双缓存(第三章)中,颜色缓冲区由两个缓冲区组成,分别用于读与写,称为前缓冲区与后缓冲区如果要生成立体图像,需要提供左、右缓冲区8.1 Buffer缓冲区(缓冲区深度值k)颜色Color缓冲区k确定可以表示的颜色多少通常在RGB模式中为24位,在RGBA模式中为32位深度Depth缓冲区的k值确定深度的分辨率通常是32位,这样与浮点数或整数的精度匹配把缓冲区k个n x m平面中的任一个称为位平面(bitplane), 空间中特定位置处的k个元素构成一个像素(pixel)因此一个像素既可以是一个字节,也可以是一个整数,甚至是一个浮点数,具体与所用的缓冲区以及信息的存

6、放格式有关8.1 Buffer缓冲区(实现细节)应用程序通常并不知道在帧缓冲区中各种信息的存放方式帧缓冲区是在API的内部实现的,对用户而言它是一个黑盒子应用程序是通过API提供的函数向帧缓冲区发送(写入)信息,或者接受(读出)信息此时在通常的内存与实现的缓冲区间传送的数据需要经过一定的格式转化这时需要仔细考虑数据传送的时间效率缓冲区内部格式8.2 Digital Image数字图像有时简称为图像此时它与把几何对象和照相机组合在一起,通过某种投影过程所得到的结果(有时也称为图像)不同在程序中的图像是像素数组其大小与类型各异,具体与图像的类型有关例如,对于RGB图像,通过有一个字节表示一个颜色成

7、分,因此可以如下定义512512图像GLubyte myimage5125123;如果处理的是单色图像或者灰度图像,那么可以定义为GLubyte myimage512512;8.2 Digital Image数字图像(创建图像的一种方法)创建图像的一种方法就是利用程序代码,例如:为了创建512512图像,由88红黑相间方格构成,那么代码如下GLubyte check5125123;int i,j,k;for(i=0;i512;i+) for(j=0;j512;j+) for(k=0;k3;k+) if(8*(i+j)/64)%64) checkij0=255; else checkijk=0;

8、 8.2 Digital Image数字图像(其它方法)利用程序代码生成图像只能得到有规则模式的结果通过直接从数据获取图像例如从实验中获取了一组浮点数,那么可以把它们放缩到0到255区间中,从而形成一幅灰度图像创建图像的第三种方法就是应用光学成像设备数码相机与摄像机8.2 Digital Image数字图像(图像的格式)从数码设备采集的图像是以某种“标准”的格式存储的最常用格式GIF, TIFF, PS, EPS以及JPEG以某种顺序存储数据,并进行必要的无损压缩或者有损压缩编码都是为了满足某类应用软件的需要而提出的8.2 Digital Image数字图像(PS与EPS)PostScript

9、 (PS)图像是PostScript语言的一部分,用来控制打印机把RGB或者亮度值精确编码到7位ASCII字符集中因此PS图像可以被很多打印机以及其它设备所识别,但通常文件很大Encapsulated PostScript (EPS)类似于PS,但是提供其它信息以预览图像参考书:Thinking in PostScript从 下载8.2 Digital Image数字图像(GIF)CompuServe Incorporated 提出Graphics Interchange Format 颜色索引图像在图像中需要存贮一个颜色表以及索引数组参考文献 8.2 Digital Image数字图像(TI

10、FF)有两种形式第一种形式:图像数据的直接编码头文件信息描述图像数据的组织形式第二种形式:图像数据的压缩编码图像数据含有许多冗余信息,例如图像中很大的区域在颜色或强度上变化不大应用Lempel-Ziv算法(无损最优压缩算法)参考文献 8.2 Digital Image数字图像(JPEG)JPEG图像采用失真压缩算法,应用压缩后数据恢复原始图像存在一定的误差因此JPEG图像具有很高的压缩比(compression ratio)在原始图像中的字节数与压缩后数据中的字节数之比参考文献 8.2 Digital Image数字图像(JPEG压缩前后) 原始TIFF图像 压缩比18的JPEG图像 压缩比3

11、7的JPEG图像几乎察觉不到8.2 Digital Image数字图像(尺寸比较)原始图像:1200 x1200TIFF: 1 440 198字节每像素一个字节,加上198字节来存储文件头和尾信息JPEG: 80 109字节与38 962字节EPS: 约是TIFF的两倍压缩型TIFF: 尺寸约减少一半8.2 Digital Image数字图像(格式与OpenGL)为了从某种格式中解析出像素数组,需要知道格式的定义这种过程有时是非常复杂的OpenGL中不包含任何解析已有图像格式的函数与功能在OpenGL中的图像就是内存中存储的标准数据类型的数组8.2 Digital Image数字图像(Imag

12、e Formats)We often work with images in a standard format (JPEG, TIFF, GIF)常用格式标准格式How do we read/write such images with OpenGL?No support in OpenGL OpenGL本身不支持OpenGL knows nothing of image formatsSome code available on WebCan write readers/writers for some simple formats in OpenGL8.2 Digital Image数字

13、图像(Displaying a PPM Image)PPM (Portable Pixelmap) is a very simple formatEach image file consists of a header followed by all the pixel dataHeaderP3# comment 1# comment 2 . ment nrows columns maxvaluepixels8.2 Digital Image数字图像(Reading the Header-1)FILE *fd;int k, nm;char c;int i;char b100;float s;i

14、nt red, green, blue;printf(enter file namen);scanf(%s, b);fd = fopen(b, r);fscanf(fd,%n ,b);if(b0!=P| b1 != 3)printf(%s is not a PPM file!n, b);exit(0);printf(%s is a PPM filen,b);check for “P3” in first line文件标记8.2 Digital Image数字图像(Reading the Header-2)fscanf(fd, %c,&c);while(c = #) fscanf(fd, %n

15、, b);printf(%sn,b);fscanf(fd, %c,&c);ungetc(c,fd); skip over comments注释 bylooking for # in first column8.2 Digital Image数字图像(Reading the Data)fscanf(fd, %d %d %d, &n, &m, &k);printf(%d rows %d columns max value= %dn,n,m,k);nm = n*m;image=malloc(3*sizeof(GLuint)*nm);s=255./k;for(i=0;inm;i+)fscanf(fd,

16、%d %d %d,&red, &green, &blue );image3*nm-3*i-3=red;image3*nm-3*i-2=green;image3*nm-3*i-1=blue;scale factor8.2 Digital Image数字图像(Scaling the Image Data)We can scale the image in the pipelineglPixelTransferf(GL_RED_SCALE, s);glPixelTransferf(GL_GREEN_SCALE, s);glPixelTransferf(GL_BLUE_SCALE, s);We may

17、 have to swap bytes when we go from processor memory to the frame buffer depending on the processor. If so, we can useglPixelStorei(GL_UNPACK_SWAP_BYTES,GL_TRUE);8.2 Digital Image数字图像(The display callback显示回调)void display()glClear(GL_COLOR_BUFFER_BIT);glRasterPos2i(0,0); glDrawPixels(n,m,GL_RGB, GL_

18、UNSIGNED_INT, image); glFlush();8.3 Writing in Buffers缓存写操作Conceptually, we can consider all of memory as a large two-dimensional array of pixels 内存作为二维矩形的像素阵列We read and write rectangular block of pixels 既可以向缓冲区中写入内容,也可以从中读出内容Bit block transfer (bitblt) operations以一个像素块(位块,bit blocks)为单位进行操作The fra

19、me buffer is part of this memoryframe buffer(destination)目标writing of a block位块写操作Source源memory8.3 Writing in Buffers缓存写操作(位块操作) 在填充多边形时每次光栅化一条扫描线 当显示光栅字符时写一小块位 当进行清除操作时,改变缓冲区中所有像素的值需要在硬件和软件方面提供对位块进行尽可能有效操作的功能称为位块传送(bit-block transfer, bitblt)操作,也称为光栅化操作(raster operations, raster-ops)8.3 Writing in

20、Buffers缓存写操作(位块复制)假设要把源缓冲区中的一块nm像素复制到目标缓冲区中,那么进行这种操作的位块传送函数应当具有形式write_block (source, n, m , x, y, destination, u, v);8.3 Writing in Buffers缓存写操作(实现细节)此时有许多细节需要注意,例如:源块超过了目标缓冲区边界时该如何处理?该操作的本质在于单个函数调用改变了整个目标块从硬件的角度来看,这种处理与几何对象的处理没有任何共同点针对位块传送操作优化的硬件具有与几何操作的流水线硬件完全不同的框架在OpenGL中包含两个流水线体系8.3.1 Writing M

21、odel写入操作的模型和读写内存不同,位块传送操作有多种写入方式 Read destination pixel before writing source在写入源像素前可读出目标缓冲区中的像素读出像素写入像素8.3.1 Writing Model写入操作的模型(像素逻辑运算)源像素: s 目标像素: d写入的目标像素: d那么d = f(s, d)其中s = 0 or 1, d = 0 or 1对1位的源位和目标位,有24= 16种定义方式378.3.1 Writing Model写入操作的模型Bit Writing Modes16种逻辑运算Source and destination bit

22、s are combined bitwise源像素与目标像素逐位结合在一起16 possible functions (one per column in table)有16种可选的函数(表格中的每列为一种)replaceORXOR8.3.2 XOR mode异或模式Recall from Chapter 3 that we can use XOR by enabling logic operations and selecting the XOR write mode在第三章中我们曾激活逻辑运算功能,应用XOR运算实现了橡皮线绘图方式XOR is especially useful for

23、swapping blocks of memory such as menus that are stored off screenXOR模式在要把菜单从屏幕上移除,进行内存块切换时非常有用如果两个相应bit位相同,则结果为0,否则为1。即: 00=0, 10=1, 01=1, 11=08.3.2 XOR mode异或模式If S represents screen and M represents a menu, the sequence如果S表示屏幕像素,M表示菜单的像素,那么 S S M M S M S S M swaps the S and M 就会交换S与M的内容这样当菜单从屏幕上消

24、失后,就会自动恢复原来屏幕上的内容S M M = SS MS M S=M8.4 Bit and Pixel Operations in OpenGL (图像的像素位数)假设数字图像是由k位像素组成,这里k可以是1(二进制图像,位图bitmap), , 32(RGBA图像)或者更大的数字(更高分辨率的图像)虽然1位图像(位图)与8位(1字节)或24位(3字节)图像在原理上没有任何区别,但硬件和软件上通常把它们区别处理从硬件的角度来说,位图处理的实现与逻辑运算相关,并且一次只需处理缓冲区中的一个位平面从软件的角度来说,位图与多位图像的应用范围完全不同。通常位图用来表示字体、掩码以及图案8.4 Bi

25、t and Pixel Operations in OpenGL (位块操作)Bitblt操作对于位图才有意义字体、光标 对于多位像素和多位颜色值,这些操作的含义不是很明确此时16种操作的结果通常不对应于有意义的结果8.4.1OpenGL Buffers and the Pixel Pipeline缓存与像素流水线(结构支持) OpenGL实现了单独的像素流水线 提供了一组缓冲区数据可以在这些缓冲区之间传送,也可以在缓冲区与处理器内存间传送根据所用缓冲区的不同,可以在其中存储颜色索引、颜色分量和深度值等只有颜色缓冲区的内容可以显示在屏幕上8.4.1OpenGL Buffers and the

26、Pixel Pipeline(Raster Position光栅位置)OpenGL maintains a raster position as part of the state OpenGL维持了一个当前光栅位置,它是状态的一部分可看作在屏幕坐标系中定义的内部光标,指示光栅化像素写入的位置 Set by glRasterPos*()由此设置glRasterPos3f(x, y, z);三个浮点数定义了一个光栅位置,在变换为屏幕坐标前要经过模型-视图变换和投影变换8.4.1OpenGL Buffers and the Pixel Pipeline(光栅位置的属性)The raster pos

27、ition is a geometric entity光栅位置是一个几何实体,存储为四维齐次坐标This position in the frame buffer is where the next raster primitive is drawn在帧缓冲区中这个位置就是接下来光栅化像素被绘制的地方如果光栅位置不在视景体内,就不进行像素写入操作,整个位图或像素矩形会被裁剪掉Passes through geometric pipeline要经过几何流水线的处理Eventually yields a 2D position in screen coordinates最终产生屏幕坐标上的一个二维

28、位置对像素或位的写入采用光栅单位(整数),像素中心位于两个整数的中间值(OpenGL的做法)8.4.1OpenGL Buffers and the Pixel Pipeline(Buffer Selection缓冲区的选择)OpenGL can draw into or read from any of the color buffers (front, back, auxiliary) OpenGL可以向任何缓冲区中写入内容,或者从中读取内容Default to the back buffer默认的是后缓冲区Change with可以用glDrawBuffer and glReadBuffe

29、r 改变当前的读写缓冲区Note that format of the pixels in the frame buffer is different from that of processor memory and these two types of memory reside in different places注意在帧缓冲区中像素的格式与它在处理器的内存中的格式是不同的Need packing and unpacking需要打包与解包Drawing and reading can be slow绘制与读取可能会很慢 8.4.1OpenGL Buffers and the Pixel

30、 Pipeline (The Pixel Pipeline像素流水线)OpenGL has a separate pipeline for pixels OpenGL为像素处理专门设计了一个流水线Writing pixels involves写入像素需要下述操作Moving pixels from processor memory to the frame buffer从处理器内存中把像素移动到帧缓冲区Format conversions进行必要的格式转化Mapping, Lookups, Tests映射、查找以及测试Reading pixels读取像素需要下述操作Format convers

31、ion格式转化 8.4.1OpenGL Buffers and the Pixel Pipeline (流水线解释)解包(unpack)把像素从用户程序的格式转化为OpenGL内部所用的格式这些新像素可以通过用户定义的查找表映射到新值所得结果经过一系列测试后确定是否有必要把像素写到帧缓冲区中;如果可以写入,那么写入的方式是什么例如,可以划出一块区域,里面不绘制任何内容;或者利用逻辑操作确定如何把像素与帧缓冲区中已有数据组合在一起从帧缓冲区中把信息读取到处理器内存,需要进行打包(pack):即从OpenGL内部格式转化为程序可用的格式8.4.2 Bitmaps位图OpenGL treats 1-

32、bit pixels (bitmaps) differently from multi-bit pixels (pixelmaps) OpenGL对1位像素(位图)与多位像素(像素图)采用不同的处理方法Bitmaps are masks that determine if the corresponding pixel in the frame buffer is drawn with the present raster color可以认为位图是掩码,它确定在帧缓冲区中对应像素是否需要用当前光栅颜色绘制0 color unchanged颜色不改变1 color changed based o

33、n writing mode基于不同的写入模式改变颜色Bitmaps are useful for raster text对于光栅文本处理,位图是非常有用的GLUT font: GLUT_BIT_MAP_8_BY_138.4.2 Bitmaps位图(Raster Color光栅颜色)Same as drawing color set by glColor*() 用glColor*()设置的绘图颜色Fixed by last call to glRasterPos*()最后一次调用glRasterPos*()时的当前绘图颜色作为光栅颜色Geometry drawn in blue,Ones in

34、 bitmap use a drawing color of red 这样几何体以蓝色绘制,而位图则采用红色glColor3f(1.0, 0.0, 0.0);glRasterPos3f(x, y, z);glColor3f(0.0, 0.0, 1.0);glBitmap(.glBegin(GL_LINES); glVertex3f(.)8.4.2 Bitmaps位图(Drawing Bitmaps绘制位图)glBitmap(width, height, x0, y0, xi, yi, bitmap)first raster position开始光栅位置second raster position下一光栅位置offset from raster position相对当前光栅位置的偏移值,位图的左下角increments in raster posi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论