【问题标题】:Checking depth/z when rendering triangular faces in 3d space在 3d 空间中渲染三角形面时检查深度/z
【发布时间】: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.minX2dtriangle.maxX 是被渲染的三角形(即其边界框)投影后的最小和最大 x 值到 2d 视图,它的最小/最大 Y 变量是相同的,但对于它的 Y。3dtriangle.minX3dtriangle.maxX 是 3d 三角形 投影之前的最小和最大 x 值在 2d 视图上a, b, c, and d 是 3d 三角形所在平面的方程系数,z 是被渲染像素对应的 z 值。

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

【问题讨论】:

    标签: java 3d rendering projection zbuffer


    【解决方案1】:

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

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

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

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

    嗯,希望这会有所帮助!

    【讨论】:

    • 我想我明白你的意思,但我只是有疑问。我是在 2d 渲染三角形的线上计算 dy/dx 的斜率,还是在投影之前计算 3d 三角形边缘的斜率?
    • @user2649681 基于二维三角形。从视点计算出顶点后,就不再需要原来的空间坐标了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    相关资源
    最近更新 更多