i社区用户: 密码:
搜索:
首页| 资讯| 信息化| 产品| 专题| 创业| 技术天地| 企业中心| 企业论坛| 职场| 周报全文| 商城| 市场
会展| Blog| i社区| 社区联盟| RSS| 电子杂志| 发行| 直播| IT两会| i| 下载| 上网导航| CIO俱乐部

利用位覆盖技术实现图形实体的明暗处理 鄂大伟 汪精明

鄂大伟

在图形设计中,为了使画出的图像更具有真实感,通常需要模拟任意两种
颜色之间的明暗层次以产生实体模型的真实明暗效果,例如从黑色自然过渡到
蓝色再到深蓝色。然而,由于在硬件上受到可能产生的像素颜色数目的限制,
至使目前流行的一些图形适配器不能进行平滑的明暗处理。例如在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
中国计算机世界出版服务公司版权所有