0

我的问题可以简化为:如果将 3d 三角形投影并渲染到 2d 观察平面,如何计算每个被渲染像素的 z 值以便存储到缓冲区?

我目前有一个可以工作的 Java 程序,它能够将 3d 三角形作为纯色渲染到 2d 视图,并且相机可以毫无问题地移动、旋转等,完全按照人们的预期工作,但如果我尝试将两个三角形相互叠加,靠近相机的一个会遮挡更远的一个,但情况并非总是如此。AZ 缓冲区似乎是解决此问题的最佳方法,存储我渲染到屏幕的每个像素的 z 值,然后如果有另一个像素试图渲染到相同的坐标,我将其与 z 值进行比较决定渲染哪个像素时的当前像素。我现在面临的问题如下:

如何确定我渲染的每个像素的 z 值?我想了想,似乎有几种可能。一种选择涉及找到面部所在的平面方程(ax + by + cz + d = 0),然后对正在渲染的三角形中的每个像素进行某种插值(例如,在 2d 渲染的三角形上沿 x 方向的一半-> 通过 3d 三角形的中途 x 方向,y 相同,然后使用平面方程求解 z),但我不确定这是否可行。我想到的另一个选择是迭代3d三角形的每个点,给定量子,然后使用该点的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.minX,被渲染2dtriangle.maxX的三角形(即其边界框)的最小和最大 x 值在被投影到 2d 视图后,并且它的最小/最大 Y 变量是相同的, 但对于它的 Y.3dtriangle.minX和是 3d 三角形在投影到 2d 视图之前3dtriangle.maxX的最小和最大 x 值, 是3d三角形所在平面的方程的系数,是对应的 z 值被渲染的像素。a, b, c, and dz

这种方法行得通吗?如果有任何歧义,请在关闭问题之前在评论中告诉我!谢谢你。

4

1 回答 1

0

最好的解决方案是计算三角形每个顶点的深度。然后,我们可以像在使用 Gouraud 着色渲染三角形时一样对颜色进行处理,从而获得每个像素的深度。与渲染同时进行可以轻松检查深度。

如果我们有这样的情况:

三角形

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

你没有提供你的渲染方法,所以不能说任何具体的东西,但你应该看看一些与 Gouraud 着色相关的教程。对它们进行一些简单的修改,您应该能够将其与深度值一起使用。

好吧,希望这会有所帮助!

于 2015-04-19T15:34:12.677 回答