基于x-scan扫描线的3D模型渲染算法

基于x-scan算法实现的z-buffer染色。c#语言,.net core framework 3.1运行。

模型是读取3D Max的obj模型。

x-scan算法实现:

cs 复制代码
public List<Vertex3> xscan() {
	List<Vertex3> results = new List<Vertex3>();

	SurfaceFormula formula = getFormula();
	Box rect = getBound();

	for (int y = rect.IntMinY; y <= rect.IntMaxY; y++) {

		List<double> set = new List<double>();

		for (int i = 0; i < this.vectex.Length; i++) {
			Vertex3 v1 = this.vectex[i];
			Vertex3 v2 = this.vectex[(i + 1) % vectex.Length];

			if (v1.IntY == v2.IntY || y < Math.Min(v1.Y, v2.Y) || y > Math.Max(v1.Y,v2.Y ))
				continue;

			LineFormula formula1 = new LineFormula(v1, v2);
			Double? x = formula1.getX(y);

			if (x != null) {
				bool e = false;
				foreach (double d in set) 
					if (Math.Abs(d - x.Value) < 0.005)
						e = true;
				
				if (e == false)
					set.Add(x.Value);
			}

		}

		if (set.Count > 0 && set.Count % 2 == 0) {
			set.Sort();

			for (int i=0; i<set.Count-1; i++)
				for (int x = (int)set[i]; x <= (int) set[i + 1]; x++)
					results.Add(new Vertex3(x, y, formula.getZ(x, y)));
			
		}
	}

	return results;
}

z-buffer算法:

cs 复制代码
private List<Vertex3RGB> zbuffer(Model.Model model, Bitmap canvas) {
	int?[,] deep = new int?[canvas.Width, canvas.Height];
	Vertex3RGB[,] pixels = new Vertex3RGB[canvas.Width, canvas.Height];

	for (int i = 0; i < canvas.Width; i++)
		for (int j = 0; j < canvas.Height; j++)
			deep[i, j] = null;


	foreach (Surface surface in model.Surface)
	{
		Vertex3 nv = surface.NormalVector();
		if (this.normalvector && nv.Z <= 0)
			continue;

		List<Vertex3> results = surface.xscan();

		foreach (Vertex3 v in results)
		{

			if (v.IntX < 0 || v.IntX >= canvas.Width)
				continue;
			if (v.IntY < 0 || v.IntY >= canvas.Height)
				continue;

			if (deep[v.IntX, v.IntY] == null || v.IntZ > deep[v.IntX, v.IntY])
			{
				deep[v.IntX, v.IntY] = v.IntZ;
				pixels[v.IntX, v.IntY] = new Vertex3RGB(v, brushColor.ToArgb(), nv);
			}
		}
	}


	List<Vertex3RGB> r = new List<Vertex3RGB>();
	for (int i = 0; i < pixels.GetLength(0); i++)
		for (int j = 0; j < pixels.GetLength(1); j++)
			if (pixels[i, j] != null)
				r.Add(pixels[i, j]);

	return r;
}

原始模型如下(使用法相量):

基于x-scan的zbuffer算法(使用法向量):

基于x-scan光照渲染(使用法向量):

相关推荐
你撅嘴真丑4 小时前
第九章-数字三角形
算法
uesowys4 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder5 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮5 小时前
AI 视觉连载1:像素
算法
智驱力人工智能5 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥6 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风6 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風6 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT066 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠7 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法