(https://gamedev.stackexchange.com/questions/174857/mapping-a-texture-to-a-2d-quadrilateral/174871), gamedev Z, , C, , , ( ):
float distance(int ax, int ay, int bx, int by) {
int x = ax-bx;
int y = ay-by;
return sqrtf((float)(x*x + y*y));
}
void gfx_quad(gfx_t *dst
,gfx_t *src
,int *quad
)
{
int *v = quad;
float z = 20.0;
float top = distance(v[0],v[1],v[2],v[3]);
float bot = distance(v[4],v[5],v[6],v[7]);
float lft = distance(v[0],v[1],v[4],v[5]);
float rgt = distance(v[2],v[3],v[6],v[7]);
float az = 1.0;
float bz = 1.0;
float cz = 1.0;
float dz = 1.0;
if (top<bot) {
az *= top/bot;
bz *= top/bot;
} else {
cz *= bot/top;
dz *= bot/top;
}
if (lft<rgt) {
az *= lft/rgt;
cz *= lft/rgt;
} else {
bz *= rgt/lft;
dz *= rgt/lft;
}
gfx_textured(dst, src
, v[0],v[1],az, v[2],v[3],bz, v[4],v[5],cz
, 0.0,0.0, 1.0,0.0, 0.0,1.0);
gfx_textured(dst, src
, v[2],v[3],bz, v[4],v[5],cz, v[6],v[7],dz
, 1.0,0.0, 0.0,1.0, 1.0,1.0);
}
I do this in software for scaling and rotating 2d sprites, and for an OpenGL 3d application you will need to do this in a pixel / fragment shader if you cannot map these imaginary az, bz, cz, dz into your real three-dimensional space and use ordinary conveyor. DMGregory gave the exact code for OpenGL shaders: https://gamedev.stackexchange.com/questions/148082/how-can-i-fix-zig-zagging-uv-mapping-artifacts-on-a-generated-mesh-that- tapers