答えてくれてありがとう、しかし実験した後、私は解決策を見つけました。

左側の 2 つの三角形はこれに従って uv (strq) を持ち、右側の 2 つの三角形はこの遠近補正の修正版です。
数字とシェーダー:
tri1 = [Vec2(-0.5, -1), Vec2(0.5, -1), Vec2(1, 1)]
tri2 = [Vec2(-0.5, -1), Vec2(1, 1), Vec2(-1, 1)]
d1 = length of top edge = 2
d2 = length of bottom edge = 1
tri1_uv = [Vec4(0, 0, 0, d2 / d1), Vec4(d2 / d1, 0, 0, d2 / d1), Vec4(1, 1, 0, 1)]
tri2_uv = [Vec4(0, 0, 0, d2 / d1), Vec4(1, 1, 0, 1), Vec4(0, 1, 0, 1)]
この glsl シェーダーを使用して直角三角形のみがレンダリングされます (左側は固定パイプラインです)。
void main()
{
gl_FragColor = texture2D(colormap, vec2(gl_TexCoord[0].x / glTexCoord[0].w, gl_TexCoord[0].y);
}
つまり、U のみがパースペクティブで、V はリニアです。