微信扫一扫 分享朋友圈

已有 1467 人浏览分享

开启左侧

GAMES101_03

[复制链接]
1467 1
回帖奖励 1 艺术分      回复本帖可获得 1 艺术分奖励! 每人限 1 次
购买主题 本主题需向作者支付 1 创新分 才能浏览

评论 1

Z君好困  妖精巫师  发表于 2023-4-14 13:10:12 | 显示全部楼层

双线性插值前后对比:

前:

Y1P`_M2WBR9`WFJ2DX9HW.png

后:

X72H@BSA_1UE~2YSXH3UJ.png

线性插值代码:

Eigen::Vector3f getBilinnerColor(float u, float v)
    {
        // 坐标限定
        if (u < 0) u = 0;
        if (u > 1) u = 1;
        if (v < 0) v = 0;
        if (v > 1) v = 1;
        float u_img = u * width;
        float v_img = (1 - v) * height;
        // find center coordinates
        int cx = u_img;
        int cy = v_img;
        cx = (u_img - cx) > 0.5 ? std::ceil(u_img) : std::floor(u_img);
        cy = (v_img - cy) > 0.5 ? std::ceil(v_img) : std::floor(v_img);

        // 注意 image_data 第一个坐标对应 v,参考getColor()
        // 并且uv map和image的 v 是相反方向 !!
        auto u00 = image_data.at<cv::Vec3b>(cy + 0.5, cx - 0.5);
        auto u10 = image_data.at<cv::Vec3b>(cy + 0.5, cx + 0.5);
        auto u01 = image_data.at<cv::Vec3b>(cy - 0.5, cx - 0.5);
        auto u11 = image_data.at<cv::Vec3b>(cy - 0.5, cx + 0.5);

        float s = u * width - (cx - 0.5);
        float t = (1 - v) * height - (cy - 0.5);

        auto u0 = (1 - s) * u00 + s * u10; // at the top
        auto u1 = (1 - s) * u01 + s * u11; // at the bottom 

        auto res = (1 - t) * u1 + t * u0;
        return Eigen::Vector3f(res[0], res[1], res[2]);
    }

具体参考:Games101|作业3 + shading + 双线性插值 + 疑惑 - 知乎 (zhihu.com)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

1

粉丝

11

主题
精彩推荐
热门资讯
网友晒图
图文推荐
  • iOS App

  • 安卓App

Archiver|手机版|小黑屋|技你太美101

GMT+8, 2024-12-4 01:26 , Processed in 0.107839 second(s), 37 queries .

Powered by 技你太美101

© 2024 JNTM101 Team