【问题标题】:Raytracer texture mapping leaving artifacts光线追踪器纹理映射留下伪影
【发布时间】:2013-04-09 17:23:07
【问题描述】:

所以我试图让 OBJ 加载在我的光线追踪器中工作。加载 OBJ 工作正常,但我在纹理映射工作时遇到了一些问题。

这是我的结果的图像。它应该是一个带有彩色“经纬度”线的黑色球体,中间有一个黑点。但似乎每隔一个三角形都是黑色的。你可以在这里看到结果:

我的教授说看起来法线是向后的,但我不认为是这种情况,因为形状仍在被击中 - “错误”三角形的颜色是背景颜色的颜色纹理(即在这种情况下为黑色)。

当我加载 OBJ 时,每个顶点都有一个与之关联的 UV 坐标。当光线击中形状时,我如何获得 UV 坐标如下:

T: the triangle that was hit
hp: where on the triangle the ray hit
v1,v2,v3: the vertices of the triangle, each has a UV coord UV1, UV2, UV3

find the distance to each v[i] from hp (d1,d2,d3 respectively)
find the weight of each of these (w1 = d1/(d1+d2+d3), same for d2,d3)
find the weighted UV coord: UV1/w1 + UV2/w2 + UV3/w3

find the pixel color based on this weighted coord

有人知道会发生什么吗?如果您认为有帮助,我可以发布我的部分代码。

【问题讨论】:

    标签: c++ debugging geometry texture-mapping raytracing


    【解决方案1】:

    您的 UV 坐标计算确实存在错误(无论您的法线是否存在其他错误)。

    我这么说的原因是:例如,如果您的 hp 非常接近 v1,那么您最终的权重 w1 将非常接近于零,并且当您计算 UV1/w1 时,它会趋向于 +infinity 而不是期望值 UV1。

    因此您需要查看barycentric coordinates

    【讨论】:

    • 在尝试重心坐标(内置方法 Vector3.Barycentric)之后,结果证明它给出的结果与我之前的方法完全相同。我有一个可行的想法……
    • 根据您提供的伪代码,这是唯一可以检测到的错误。其他任何事情都只是随机猜测(翻转的法线、未正确加载的 UV、与 UV 顺序相比不正确的顶点顺序等)。也可能是您对重心坐标的使用不正确(它不可能给出/完全/相同的东西,否则还有其他严重错误的东西,因为公式不同)
    • 我刚刚意识到我不是除以重量,而是乘以......这可能会发生很大变化!我的教授告诉我研究双线性插值,它给出了一个非常相似的图像(尽管值不完全相同)
    • 是的,这是有道理的。根据图像,您可能有错误的顶点顺序 - 如果您确实在相乘,这不仅仅是插值的问题。就像顶点 0 的 uv 分配给顶点 1 等一样(基本上,如果你将 3 个顶点中的两个交换为一半的三角形,看起来它看起来是正确的)
    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多