在3d空间中渲染三角形面时检查深度/ z

时间:2015-04-19 15:11:43

标签: java 3d rendering projection zbuffer

我的问题可以简化为以下内容:如果正在投影3d三角形并渲染到2d视图平面,那么如何计算每个像素的z值以便存储到缓冲区?

我目前有一个可以运行的Java程序,能够将3d三角形渲染为2d视图作为纯色,并且摄像机可以移动,旋转等,没有任何问题,正如人们所期望的那样工作,但是如果我试图在彼此之间渲染两个三角形,那么靠近相机的那个三角形预计会遮挡得越远,这种情况并非总是如此。 AZ缓冲区似乎是如何解决这个问题的最好的想法,将我呈现的每个像素的z值存储到屏幕,然后如果有另一个像素试图渲染到相同的坐标,我将它与z值进行比较决定渲染哪一个时的当前像素我现在面临的问题如下:

如何确定我渲染的每个像素的z值?我已经考虑过了,似乎有一些可能性。一个选项涉及找到面所在的平面方程(ax + by + cz + d = 0),然后对正在渲染的三角形中的每个像素进行某种插值(例如,在2d渲染三角形上的中间x方向) - >通过3d三角形的x-中途,y相同,然后使用平面方程求解z,但我不确定这是否有效。我想到的另一个选项是迭代每个点,使用给定量子的三角形,然后使用该点的z(我也可能必须通过平面方程找到)单独渲染每个点。

同样,我目前主要考虑使用插值,所以伪代码看起来像(如果我将平面的方程式设为“ax + by + cz + d = 0”):

xrange = (pixel.x - 2dtriangle.minX)/(2dtriangle.maxX - 2dtriangle.minX)
yrange = (pixel.y - 2dtriangle.minY)/(2dtriangle.maxY - 2dtriangle.minY)
x3d = (3dtriangle.maxX - 3dtriangle.minX) * xrange + 3dtriangle.minX
y3d = (3dtriangle.maxY - 3dtriangle.minY) * yrange + 3dtriangel.minY
z = (-d - a*x3d - b*y3d)/c

pixel.x是正在渲染的像素的x值,2dtraingle.minX2dtriangle.maxX是正在渲染的三角形的最小和最大x值(即其边界框)< strong>投影到2d视图之后,它的最小/最大Y变量是相同的,但是对于它的Y. 3dtriangle.minX3dtriangle.maxX是最小和最大x值投影到二维视图之前的三维三角形 a, b, c, and d是三角形所在平面方程的系数,z是对应的z正在渲染的像素的值。

这种方法有用吗?如果有任何歧义请在结束问题之前在评论中告诉我!谢谢。

1 个答案:

答案 0 :(得分:0)

最好的解决方案是计算三角形每个顶点的深度。然后,当使用Gouraud着色渲染三角形时,我们能够以与颜色相同的方式获得每个像素的深度。与渲染同时执行此操作可以轻松检查深度。

如果我们遇到这样的情况:

triangle

我们开始从上到下画线。我们计算从第一点到另一点的斜率,并在每次移动到下一行时添加正确的深度......依此类推。

您没有提供渲染方法,因此无法说出任何具体内容,但您应该查看一些与Gouraud着色相关的教程。对它们做一些简单的修改,你应该能够使用深度值。

嗯,希望这会有所帮助!