|
||||
利用位覆盖技术实现图形实体的明暗处理 鄂大伟 汪精明鄂大伟 |
|
在图形设计中,为了使画出的图像更具有真实感,通常需要模拟任意两种 颜色之间的明暗层次以产生实体模型的真实明暗效果,例如从黑色自然过渡到 蓝色再到深蓝色。然而,由于在硬件上受到可能产生的像素颜色数目的限制, 至使目前流行的一些图形适配器不能进行平滑的明暗处理。例如在VGA 6 40×480,16色方式下对于每种颜色只能产生两种不同亮度级,灰度等 级最多也只有四种。很明显,真实物体的明暗层次远远不止这些,利用这些有 限的颜色所显示模拟的明暗效果是很粗糙和不自然的。 位覆盖技术是指在区域填充中建立位模式,在填充过程中按指定填充模式 产生不同级别的明暗浓淡色彩。例如,如果对屏幕上每两个像素位置选择其一 填色的话,则会产生50%的明暗效果,即色饱和度介于黑色和本色的中间, 依此类推,可获得不同明暗色度的对比,如果采用调色板技术,还可以产生许 多新的混合色。 采用位覆盖技术生成实体模型一般需要以下几个步骤:定义位覆盖像素矩 阵;填充实体图形的各个表面使具有适当的明暗层次;使用线型技术除去表面 边界线。 在C语言中,用户定义的填充模式是通过setfillpattern ()函数实现的,其函数原型为: void far setfillpattern(char* upattern,int color) 第一个参数upattern是一个指向8个字节的指针数组,它定义填 充操作中使用的模式,这8个字节定义了8×8点阵的图形。每个字节的8位 二进制表示水平8点,8个字节表示8行,然后以此为模型向整个封闭域填空 。例如,实填充模式可被定义为: char fillpattern[]={0XFF,0XFF,0X FF,0XFF,0XFF,0XFF,0XFF,OXFF} 本文所附Turbo C程序给出了在EGA、VGA图形适配器上生成 有丰富明暗层次效果用到的填充模式的矩阵的集合,每种填充模式矩阵都是精 心构造出来的,屏幕上可显示出不同颜色的色度自然过渡到饱和色度的明暗层 次效果,可用于三维或三维图形的实体模拟。 ***** /********************* *图形实体明暗层次处理显示程序* #include #include #include #include void swatches(void); float sx,sy; float x-res=640,y-res=480; int COLOR1=0; float x1=0,y1=240,x2=0,y2=0,x3=0,y3=0,x4=0,y4=0; float x-offset=54,y-offset=32,x-change=54,y-change=32; int t1=1,t2=1,t3=1; /*填充模式定义*/ char fill[12][8]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x02,0x00,0x00, 0x20,0x00,0x02,0x00,0x80,0x00,0x08,0x00, 0x20,0x02,0x80,0x08,0x20,0x02,0x80,0x08, 0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11, 0xAA,0x44,0xAA,0x11,0xAA,0x44,0xAA,0x11, 0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA, 0x55,0xBB,0x55,0xEE,0x55,0xBB,0x55,0xEE, 0xBB,0xEE,0xBB,0xEE,0xBB,0xEE,0xBB,0xEE, 0xDF,0xFD,0x7F,0xF7,0xDF,0xFD,0x7F,0xF7, 0xFF,0xDF,0xFF,0xDF,0xFF,0xDF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; main() { int adapter=VGA,mode=VGAHI,i; initgraph(&adapter,&mode,""); y1=0; for(i=1;ia15;i++){ x1=0; COLOR1=i; swatches(); y1=y1+y-change; } setcolor(7):moveto(0,472); outtext("640x480 16-color VGA MODE"); getch(); cleardevice(); restorecrtmode(); return; } /*计算显示15种颜色的各种明暗层次效果*/ void swatches(void) { int 1; for (i=0;ia12;i++){ x2=x1+x-offset; y2=y1+y-offset; sx=x1;sy=y1; sx=sx*(x-res/640); sy=sy*(y-res/480); x3=sx;y3=sy; sx=x2;sy=y2; sx=sx*(x-res/640); sy=sy*(y-res/480); x4=sx,y4=sy; setfillpattern(fill[i],COLOR1); bar(x3,y3,x4,y4); x1=x1+x-change; } } ***** (计算机世界报 1994年 第9期) |
周报全文频道联系方式:010-68130909 |
||||||
| 【关于我们】 【广告服务】 【周报发行】 【投稿指南】 【投稿声明】 【联系方式】 【法律声明】 【媒体手册】 【编读往来】 |
||||||
| Copyright© ccw.com.cn,All rights reserved | ||||||
| 中国计算机世界出版服务公司版权所有 | ||||||