3D软引擎之深度排序

花了不少时间去实现了这个功能,大多问题都出现在低级错误,看来以后要提醒十二分精神!错误的原因是:

<span style="color: rgb(255, 255, 255); font-family: Arial; font-size: 14px; line-height: 22px;"> </span>void CTriangle2DUtils::DrawSolidGeneralClipZOrder( D3DXVECTOR3 p0,
	D3DXVECTOR3 p1,
	D3DXVECTOR3 p2, int color )
{

	if (p0.y > p1.y)  Math3D::Swap(p0 , p1);
	if (p0.y > p2.y) Math3D::Swap(p0 , p2);
	if (p1.y > p2.y) Math3D::Swap(p2 , p1);

	if (p0.y > BTM_BORDER_SCR ||
		p2.y < TOP_BORDER_SCR ||
		(p0.x < LEFT_BORDER_SCR && p1.x < LEFT_BORDER_SCR && p2.x < LEFT_BORDER_SCR) ||
		(p0.x > RIGHT_BORDER_SCR && p1.x > RIGHT_BORDER_SCR && p2.x > RIGHT_BORDER_SCR) )
		return;//在可显区域外

	//inv z
	p0.z = 1.0f / p0.z;
	p1.z = 1.0f / p1.z;
	p2.z = 1.0f / p2.z;

	if (FCMP( p0.x , p1.x ) && FCMP( p1.x, p2.x ) ||
		FCMP( p0.y , p1.y ) && FCMP( p1.y, p2.y ) )
	{//绘制退化直线
		DrawDeclineClip(p0 , p1,  p2 , color);
	}
	else if (FCMP( p0.y , p1.y ) )
	{
		CTriangle2DUtils::DrawSolidFlatTopClipZOrder(p0 , p1, p2, color);
	}
	else if ( FCMP( p1.y , p2.y ) )
	{
		CTriangle2DUtils::DrawSolidFlatBottomClipZOrder(p0 , p1, p2, color);
	}
	else
	{
		//had inve z
		float dzdy = (p2.z - p0.z ) / (p2.y - p0.y);
		//float newz = dzdy * (p2.y - p0.y) + p0.z;---------------就这里没有改回来导致了z排序错误
		float newz = dzdy * (p1.y - p0.y) + p0.z;//应该改成这样---------------
		//float newzInv = 1.0f / newz;
		D3DXVECTOR3 pc( LINE_X_NOF(p0.x, p0.y, p2.x, p2.y, p1.y) , p1.y , newz);
		CTriangle2DUtils::DrawSolidFlatBottomClipZOrder(p0 , p1, pc, color);
		CTriangle2DUtils::DrawSolidFlatTopClipZOrder(p1 , pc, p2, color);
	}
}

时间: 2024-10-14 06:44:57

3D软引擎之深度排序的相关文章

使用Windows GDI 做一个3D”软引擎“-Part1

前: 最近几天一个很虎比的教程吸引了我的视线,原作者使用c# / JavaScript逐步实现了一个基本的3D软引擎. 我不懂上面提到的语言,所以,准备用我熟悉的C++和Win32实现重造这个轮子.:) 注意: 这不是一篇关于DirectX / OpenGL (GPU)的文章,本系列文章将实现一个软件(CPU)驱动的“DirectX”,很有趣吧,啊哈. 本文假设读者有一定的计算机图形学的基础,使用OpenGL / DirectX 写过程序. 本文假设读者有一定的Win32基础(不是MFC),最起

【转载】Alpha混合物体的深度排序

原文:Alpha混合物体的深度排序 先说个题外话, 本来我想解答一下最近Creators Club论坛上经常出现的一个问题, 意外的是在网上竟然找不到什么全面的答案.. 这是个有着复杂答案的简单问题: “为什么我的透明物体的绘制顺序不对, 或者有些不见了?” 当绘制一个3D场景时, 对图形进行深度排序是非常重要的, 这样离镜头近才画在远处物体的前面. 我们不会希望看到远处的山把近在眼前的建筑给挡住了! 如今有三种深度排序方法得到了广泛的应用: 深度缓冲 (也叫做 z-buffering) 油画家

深度排序与alpha混合 【转】

  翻译:李现民 最后修改:2012-07-03 原文:Depth sorting alpha blended objects 先说个题外话,本来我想回答在 Creators Club论坛上的一个常见问题,但(意外的是)我竟然没能从网上找到一个令人满意的答案. 问题本身很简单,但答案却有些复杂: “为什么我的透明物体的绘制顺序是错误的,或者为什么它们的一部分不见了?” 当绘制一个3D场景的时候,将图形按深度排序非常重要,只有这样靠近摄像机的物体才能被绘制在(离摄像机)更远的物体的上面.我们不会希

【Unity Shaders】Transparency —— 使用渲染队列进行深度排序

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 为了让我们真正明白透明度,我们需要了解一下深度排序,或者说,对象的绘制顺序.Unity允许

深度排序与alpha混合

原文: https://blogs.msdn.microsoft.com/shawnhar/2009/02/18/depth-sorting-alpha-blended-objects/ 翻译:李现民 最后修改:2012-07-03 "为什么我的透明物体的绘制顺序是错误的,或者为什么它们的一部分不见了?" 当绘制一个3D场景的时候,将图形按深度排序非常重要,只有这样靠近摄像机的物体才能被绘制在(离摄像机)更远的物体的上面.我们不会希望远方的山脉被绘制在近在眼前的建筑物的上面! 当前得到

Unity3D ShaderLab 修改渲染队列进行深度排序

为了更深刻的理解透明度,我们还需要学习一下深度排序,简单来说就是物体被渲染的先后顺序. Unity允许我们通过代码来控制某个特定物体渲染到屏幕的顺序.这个做法类似于photoshop中图层的概念. 开始之前,准备工作还是新建Shader Material,准备测试场景.为了对比 是需要使用2个材质球的. 打开我们的shader,稍微编辑一下即可看到效果.过程简单如下: Shader "91YGame/DepthSort" { Properties { _MainTex ("B

Top 10:HTML5、JavaScript 3D游戏引擎和框架

由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.Android.Windows或其他任何平台上运行. 有很多的JavaScript能够用于创建基于浏览器.使用HTML5和WebGL的3D游戏.然后,选择一个合适的游戏引擎是一个不小的挑战,它有时能帮你完成项目或突破项目瓶颈. 为了让你的选择变的容易,我们已经通过分析大多数JavaScript 3D游

【转载】从零实现3D图像引擎:(2)画2D直线不简单

原文:从零实现3D图像引擎:(2)画2D直线不简单 1. 数学分析 1) 画直线的问题 本来我以为画直线会很容易,随便拿个直线公式,遍历X求Y画出来不就完了么,但事实并非如此.以2D直线为例,因为3D直线也只是多引入了个Z坐标而已.关键的问题:我们在数学中所学的直线是基于实数域的,而在计算机屏幕上,所画的直线是基于正整数域的,可以想象这么一个情形,在直线的某一点X=1,Y=0.01时,在屏幕上如何画呢?下图对比了实数域的直线,与基于正整数域的直线: 为什么直线在正整数域是不连续的呢,还记得斜率的

HTML5、JavaScript 3D游戏引擎和框架

由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.Android.Windows或其他任何平台上运行. 有很多的JavaScript能够用于创建基于浏览器.使用HTML5和WebGL的3D游戏.然后,选择一个合适的游戏引擎是一个不小的挑战,它有时能帮你完成项目或突破项目瓶颈. 为了让你的选择变的容易,我们已经通过分析大多数JavaScript 3D游