一、 实验目的。
改进的z-buffer算法实现。
二、 实验工具
VC6.0
三、 实验步骤
算法思想:先将Z缓冲器中各单元的初始值置为最小值,当要改变某个象素的颜色值时,首先检查当前多边形的深度值是否大于该象素原来的深度值(保存在该象素所对应的Z缓冲器的单元中),如果大于原来的Z值,说明当前多边形更靠近观察点,用它的颜色替换原象素的颜色。
具体实现:
Z-Buffer算法()
{帧缓存全置为背景色
深度缓存全置为最小z值
for(每一个多边形)
{ 扫描转换该多边形
for(该多边形所覆盖的每个象素(x,y) )
{计算该多边形在该象素的深度值Z(x,y);
if(z(x,y)大于z缓存在(x,y)的值)
{把z(x,y)存入z缓存中(x,y)处
把多边形在(x,y)处的颜色值存入帧缓存的(x,y)处
}
}
}
}
只用一个深度缓存变量zb的 改进算法:
Z-Buffer算法()
{ 帧缓存全置为背景色
for(屏幕上的每个象素(i,j))
{ 深度缓存变量zb置最小值MinValue
for(多面体上的每个多边形Pk)
{
if(象素点(i,j)在pk的投影多边形之内)
{
计算Pk在(i,j)处的深度值depth;
if(depth大于zb)
{ zb = depth;
indexp = k;(记录多边形的序号)
}
}
}
If(zb != MinValue) 计算多边形P 在交点 (I,j) 处的光照颜色并显示
}
}
代码如下:
#include "stdio.h"
//两个多边形进行算法验证
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <graphics.h>
#include <math.h>
#define PI 3.1415926535
#define x0 500
#define y0 500 //画面的大小
void z_Buffer(int x1,int x2,int y1,int y2, int x11,int x22,int y11,int y22){ //定义z_Buffer算法
int a=3,b=3,c=4,d=2;//Pk的平面方程的参数
int depth;//深度
double MinValue=-1000000000;//深度缓存变量的最小值
int i,j,k;//后面FOR循环会用到的
int zb; //深度缓存变量
int indexp;//多边形序号
for(i=0;i<=640;i++)
{
for(j=0;j<=480;j++) //逐个扫描像素点(i,j)
{
zb=MinValue;//把MinValue给了zb
for(k=0;k<=1;k++)//每个多边形Pk
{
if( (i>=x1 && i<=x2 && j>=y1 && j<=y2) || (i>=x11 && i<=x22 && j>=y11 && j<=y22) )//像素点在Pk的投影多边形之内
{
depth = -(a*i+b*j+d)/c;//Pk在(i,j)处的depth
if(depth > zb) //当深度值大于深度缓存变量的时候,前面
{
zb=depth;
indexp=k; //记录序号
}
}
}
if(zb!=MinValue) //验证测试
{
printf("%d,%d\n",i,j);
//计算多边形P(indexp)在(i,j)处的光照颜色并显示
if(indexp = 0 && (i>=x1 && i<=x2 && j>=y1 && j<=y2) || (i>=x11 && i<=x22 && j>=y11 && j<=y22)){
putpixel(i, j, YELLOW);
}
else if(indexp = 1 && (i>=x1 && i<=x2 && j>=y1 && j<=y2) || (i>=x11 && i<=x22 && j>=y11 && j<=y22)){
putpixel(i, j, BLUE);
}
}
}
}
}
int main()
{
initgraph(x0 * 2, y0 * 2);//初始化
setbkcolor(GREEN);
cleardevice();
setcolor(BLACK);
z_Buffer(100,130,70,250, 70,200,100,230);
getch();
closegraph();
return 0;
}
四. 实验结果
懒得截图。
版权声明:本文为tomatoaaaa原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。