2

我有 1024x1 渐变纹理,我想映射到四边形。此渐变应沿该四边形内的线 (p1,p2) 对齐。纹理具有 GL_CLAMP_TO_EDGE 属性,因此它将填充整个四边形。

我现在需要计算出四边形的四个角(A、B、C、D)的纹理坐标,但我无法围绕所需的数学计算。

图片

我试图计算(p1,p2)之间的角度,然后围绕(p1,2)之间的线的中心旋转角点,但我无法让它正常工作。无论如何,这似乎有点过分 - 有没有更简单的解决方案?

4

2 回答 2

4

你在使用着色器吗?如果是,则将您的四边形仅分配默认 UV 从 0 到 1 。然后根据 p1 p2 段斜率计算旋转度数(不要忘记将它们转换为弧度)。然后在顶点着色器中构建 2x2 旋转矩阵并旋转由段定义的 UV。最后将旋转的 UV 传递到片段着色器并与渐变纹理采样器一起使用。

于 2013-01-23T19:54:57.130 回答
0

我发现了另一种方法,它实际上可以按我的意愿工作,只使用加法、乘法和一个 div;节省昂贵的 sqrt。

我首先计算 (p1,p2) 线的斜率和与之正交的斜率。然后我计算出斜坡的交点(从 p1 开始)和每个角的正交状态。

Vector2 slope = {p2.x - p1.x, p2.y - p1.y};
Vector2 ortho = {-slope.y, slope.x};

float div = 1/(slope.y * ortho.x - slope.x * ortho.y);
Vector2 A = {
    (ortho.x * -p1.y + ortho.y * p1.x) * div,
    (slope.x * -p1.y + slope.y * p1.x) * div
};
Vector2 B = {
    (ortho.x * -p1.y + ortho.y * (p1.x - 1)) * div,
    (slope.x * -p1.y + slope.y * (p1.x - 1)) * div
};
Vector2 C = {
    (ortho.x * (1 - p1.y) + ortho.y * p1.x) * div,
    (slope.x * (1 - p1.y) + slope.y * p1.x) * div
};
Vector2 D = {
    (ortho.x * (1 - p1.y) + ortho.y * (p1.x - 1)) * div,
    (slope.x * (1 - p1.y) + slope.y * (p1.x - 1)) * div
};
于 2013-01-24T17:11:00.433 回答