绘制带有纹理的 3D 三角形时如何校正透视?

Tom*_*Tom 5 c# 3d gdi

我一直致力于一个 3D 渲染项目作为技术练习,看看我是否可以复制许多 3D 框架已经做的事情:从加载模型到将三角形绘制到准备绘制的缓冲区。

这是我设法制作的示例 程序输出渲染

正如您从屏幕截图中看到的那样,我在绘制表面纹理时遇到了障碍。我发现这个维基百科链接解释了仿射与非仿射。其他一些与此类似的关于透视正确纹理映射的链接更详细地介绍了它。

我仍然不明白如何在绘制像素时纠正 UV 坐标。

我的引擎目前如何处理三角形: 将 3D 顶点数据转换为 2D 屏幕数据 调用绘制三角形 在 0 和 1 之间传递深度以及绘制三角形内的纹理细节 通过沿着三角形的 3 个边进行插值来绘制每条垂直线

我已经对链接进行了更改,但出现除以零的错误。如果我忽略它们,就不会绘制任何东西。

问题

如何纠正每个像素选择的 UV 坐标。目前,我知道每个像素的深度在 0.0 到 1.0 之间,即表观 UV。

任何帮助将非常感激。先感谢您。

汤姆:)

更新:

解决方案,使用 Andreas Brinck 的答案。效果很好。下面是它现在工作的屏幕截图。

工作正确的透视纹理映射

And*_*nck 3

不是在三角形上插值 u 和 v,而是插值 u/z、v/z 和 1/z(在顶点计算)并检索透视正确坐标为 (u/z) / (1/z) 和 (v/ z)/(1/z)。