改进的z-buffer算法实现 c

一、 实验目的。
改进的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版权协议,转载请附上原文出处链接和本声明。