【发布时间】:2015-04-19 15:11:42
【问题描述】:
我的问题可以简化为:如果将 3d 三角形投影并渲染到 2d 观察平面,如何计算每个被渲染像素的 z 值以便存储到缓冲区?
我目前有一个可以工作的 Java 程序,它能够将 3d 三角形渲染为纯色的 2d 视图,并且可以毫无问题地移动、旋转相机等,完全按照人们的预期工作,但是如果我尝试将两个三角形相互渲染,靠近相机的一个会遮挡更远的一个,但情况并非总是如此。 Z 缓冲区似乎是解决此问题的最佳方法,存储我渲染到屏幕的每个像素的 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 和 3dtriangle.maxX 是 3d 三角形 投影之前的最小和最大 x 值在 2d 视图上,a, b, c, and d 是 3d 三角形所在平面的方程系数,z 是被渲染像素对应的 z 值。
这种方法行得通吗?如果有任何歧义请在结束问题之前在 cmets 中告诉我!谢谢。
【问题讨论】:
标签: java 3d rendering projection zbuffer