2011-03-24 23 views
9

我正在写一个当前运行良好的软件渲染器,但我试图获得纹理坐标的透视校正,并且看起来不正确。我为我的渲染器使用与opengl相同的矩阵数学。要rasterise三角形我做到以下几点:纹理坐标在3D中的透视校正

  1. 使用模型视图和投影矩阵变换顶点,并转化为剪辑坐标。

  2. 用于每个三角形的每个像素,计算重心坐标进行内插的属性(颜色,纹理坐标,法线等)

  3. 以校正立体我使用透视正确插值: (W是深度的坐标顶点,c是顶点的纹理坐标,b为一个顶点的重心重量)

1/w = b0*(1/w0) + b1*(1/w1) + b2*(1/w2) 
c/w = b0*(c0/w0) + b1*(c1/w1) + b2*(c2/w2) 
c = (c/w)/(1/w) 

这应该正确的角度来看,它有一点帮助,但仍然存在明显的透视问题。我在这里错过了些什么,也许是一些舍入问题(我使用所有数学的浮点数)?

在此图像中看到纹理坐标中的误差沿着对角线明显,这是通过深度坐标进行除法的结果。

image showing incorrect perspective correction

此外,这通常是用于纹理坐标进行...是必要的其他特性(例如法线等)以及?

+1

屏幕截图可能会对您有所帮助。 – genpfault 2011-03-24 21:21:56

+0

我不能添加屏幕截图,直到我的评分为10 :( – 2011-03-25 19:15:13

+1

你现在的评分:D – Bahbar 2011-03-25 19:59:55

回答

1

是的,这看起来像你的传统破碎透视凹痕。你的算法看起来不错,所以我真的不知道什么是错的。当你渲染它时,我会检查你是否实际上使用了新计算的值?这看起来像是你计算透视正确值的麻烦,然后使用基本的非校正值进行渲染。

+0

只看数字,修正和未修正的tex坐标之间的区别是顺序为1.0e-4(tex coords的范围为[0.0,1.0])或许存在缩放问题?我是否正确使用缩放深度坐标进行缩放? – 2011-03-25 21:31:34

2

你需要告诉OpenGL的,你需要与

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST) 

你所观察到的线性纹理映射的典型失真的像素透视校正。在不支持每像素透视校正的硬件上(例如PS1),标准解决方案只是细分为较小的多边形,以使缺陷更加明显。

+0

这是一个软件渲染器,不是opengl(认为一个mod添加了该标签)...但我使用opengl数学进行所有转换 – 2011-03-25 21:33:04

+0

对不起......我看到了标签OpenGL,并假设您使用的是OpenGL(如果硬件是切换到软件渲染无论如何,你所观察到的是所谓的“线性透视投影”问题,当你为顶点计算正确的UV值但是polyfiller线性地i渲染多边形时插入它们。 – 6502 2011-03-25 21:54:41

2

从UV坐标到3D平面的唯一正确转换是单应变换。

http://en.wikipedia.org/wiki/Homography

你必须在你的计算某一点有它。

要自己找到它,您可以编写纹理的任何像素(与顶点相同)的投影,并反转它们以从屏幕坐标获取纹理坐标。它将以同形变换的形式出现。

2

我最近破解了这个问题上的代码。如果您计划在将内存分配到表面之前修改内存中的纹理,则可以使用单应性。这在计算上很昂贵,并且增加了对程序的附加依赖。有一个很好的黑客可以解决你的问题。

OpenGL自动将透视校正应用于要渲染的纹理。你所需要做的就是将你的纹理坐标(UV-0.0f-1.0f)乘以平面每个角的Z分量(XYZ位置矢量的世界空间深度),并且它将“抛弃”OpenGL的透视校正。

最近我问及解决了这个问题。给这个链接一个镜头:

texture mapping a trapezoid with a square texture in OpenGL

,我读了固定的这个问题被称为纸,"Navigating Static Environments Using Image-Space Simplification and Morphing" - page 9 appendix A.

希望这有助于!

ct