我的问题可以简化为:如果将 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 d
z
这种方法行得通吗?如果有任何歧义,请在关闭问题之前在评论中告诉我!谢谢你。