5

只需想出一种方法,使用 Pixel Shader,将纹理投影到任意用户定义的四边形。

将接受四边形四个边的坐标:

/// <defaultValue>0,0</defaultValue>
float2 TopLeft : register(c0);

/// <defaultValue>1,0</defaultValue>
float2 TopRight : register(c1);

/// <defaultValue>0,1</defaultValue>
float2 BottomLeft : register(c2);

/// <defaultValue>1,1</defaultValue>
float2 BottomRight : register(c3);

尝试了几种插值算法,但无法正确处理。

有没有你们认为我可以修改以获得所需结果的样本?

4

2 回答 2

1

There's a nice paper here describing your options (or this .ppt). Basically you need to define some barycentric coordinates across the quad, then interpolate fragment values as BC-weighted sums of the given vertex values.

Sorry, don't know of any code; the lack of direct support for quads on modern triangle-oriented HW (see voidstar69's answer) means they've rather gone out of fashion.

于 2011-10-02T23:43:21.133 回答
1

这里的问题是所有现代 3D 图形硬件都光栅化了三角形,而不是四边形。因此,如果您要求 Direct3D 或 OpenGL 渲染一个四边形,API 将在内部将四边形分成两个三角形。这通常不是问题,因为所有现代渲染都是透视正确的,因此查看者应该无法分辨一个四边形和两个三角形之间的区别 - 插值将是无缝的。

要求 API 执行此插值的正确方法是将纹理坐标作为每个顶点数据传递给它,API/硬件将在每个像素上进行插值。然后,您的像素着色器将有权访问此每像素纹理坐标。我假设当您使用术语“投影”时,您的意思是简单地将矩形纹理映射到四边形上,而不是指纹理投影(就像聚光灯将纹理照射到表面上)。

这里的底线是将四边形的纹理坐标传递给像素着色器是错误的方法(除非您有一些特殊原因需要这样做)。

于 2011-10-03T10:25:33.930 回答