Directx顶点渲染:无法为Trapetzoid获取正确显示的纹理

Directx顶点渲染:无法为Trapetzoid获取正确显示的纹理,directx,textures,vertex,Directx,Textures,Vertex,我正在尝试使用DirectX7在2d(z坐标为0)中使用顶点和索引缓冲区创建3d效果 用图片更容易解释: 问题是线路断了。他们应该是直的。要渲染此图像,将其分解为三角形,并使用DrawIndexedPrimitiveVB进行渲染。很明显,每个三角形的倾斜角度都有点不同,我不明白为什么 我是不是遗漏了一些琐碎的东西 我不确定这是否有帮助,但源和目标四边形如下所示: SPoint4:= pBounds4(1, 1, W - 2, H - 2); DPoint4:= Point4(P

我正在尝试使用DirectX7在2d(z坐标为0)中使用顶点和索引缓冲区创建3d效果

用图片更容易解释:

问题是线路断了。他们应该是直的。要渲染此图像,将其分解为三角形,并使用DrawIndexedPrimitiveVB进行渲染。很明显,每个三角形的倾斜角度都有点不同,我不明白为什么

我是不是遗漏了一些琐碎的东西

我不确定这是否有帮助,但源和目标四边形如下所示:

    SPoint4:= pBounds4(1, 1, W - 2, H - 2);
    DPoint4:= Point4(ProjTo2dX(i, FlyDist + DeepDist, W), ProjTo2dY(0, FlyDist + DeepDist, H), ProjTo2dX(W - i, FlyDist, W), ProjTo2dY(0, FlyDist, H), ProjTo2dX(W - i, FlyDist, W), ProjTo2dY(H, FlyDist, H), ProjTo2dX(i, FlyDist + DeepDist, W), ProjTo2dY(H, FlyDist + DeepDist, H));

我找到了一个解决方案,或者至少是一个解决办法。我没有将图像分成两个三角形,而是将其分成多个(几个水平条带,每个条带由两个三角形组成)。在这种情况下,图像看起来正常

在这种情况下,图像被分割为10条带(20个三角形)


我很乐意听取任何意见或其他解决方案。谢谢。

您需要提供一些透视信息,以便在梯形上进行适当的纹理坐标插值,请参见


将正方形/矩形纹理映射到任意四边形的一种方法是投影插值。我已经编写了演示如何执行此操作(使用顶点/像素着色器)


简短的版本:以类似于GPU为透视正确渲染(正如您可能已经注意到的,这不会在两个三角形之间产生可见接缝)所做的方式在四边形上插值UV。为此,需要为四边形的每个顶点计算一个假“深度”值,并基于该“深度”使用齐次坐标进行插值。完整的细节在上面链接的文章中。

我接受这个答案,因为我必须使用这种技术,以避免3d内容,这样我的应用程序可以在必要时从DirectX退回到GDI。实际上,这并不能解决问题-您现在在几何体中多次遇到相同的问题-只是不太明显,因为误差与细分网格中三角形的面积成比例。你是对的,这使得GDI更容易使用——虽然它与2d无关,与每像素操作有关。从形式上说,你完全正确,但在实践中,它已经足够好了,缺陷也不明显。当时这是我唯一的解决方案,尽管作为一名开发人员,我知道它有问题,但最终用户却不知道,并且很享受结果。下次打开项目时,我将尝试实现Natan的解决方案。谢谢,这可能会改进我的解决方案,但我需要在我的大脑工作得更好的时候阅读。