games101-作业2

news/2025/1/31 0:23:29 标签: 算法

图形管线

       Vertex Processing

        对顶点进行加工,使其变换到屏幕空间坐标。

        Triangle Processing

        将加工后的顶点组装成三角形,用于下一步的光栅化。

void rst::rasterizer::draw(pos_buf_id pos_buffer, ind_buf_id ind_buffer, col_buf_id col_buffer, Primitive type)
{   
    //从缓冲区中读取顶点坐标,索引,颜色信息
    auto& buf = pos_buf[pos_buffer.pos_id];
    auto& ind = ind_buf[ind_buffer.ind_id];
    auto& col = col_buf[col_buffer.col_id];
    
    float f1 = (50 - 0.1) / 2.0;
    float f2 = (50 + 0.1) / 2.0;
 
    Eigen::Matrix4f mvp = projection * view * model;    //计算得到mvp矩阵
    for (auto& i : ind)     //遍历索引数组,对顶点进行加工
    {
        Triangle t;
        //这里对顶点进行mvp变换,并将结果存入v
        Eigen::Vector4f v[] = {
                mvp * to_vec4(buf[i[0]], 1.0f),
                mvp * to_vec4(buf[i[1]], 1.0f),
                mvp * to_vec4(buf[i[2]], 1.0f)
        };
        //因为得到的结果w值是原本的z值,所以除以w才是变换后在[-1,1]^3的空间中的坐标
        for (auto& vec : v) {
            vec /= vec.w();
        }
        //将归一化设备坐标的点转换到屏幕空间坐标
        for (auto & vert : v)
        {
            vert.x() = 0.5*width*(vert.x()+1.0);
            vert.y() = 0.5*height*(vert.y()+1.0);
            vert.z() = vert.z() * f1 + f2;  
        }
        //将屏幕空间的点组装成三角形
        for (int i = 0; i < 3; ++i)
        {
            t.setVertex(i, v[i].head<3>());
            t.setVertex(i, v[i].head<3>());
            t.setVertex(i, v[i].head<3>());
        }
        //从颜色缓冲区中读取颜色
        auto col_x = col[i[0]];
        auto col_y = col[i[1]];
        auto col_z = col[i[2]];
        //为三角形的每个顶点附上颜色数据
        t.setColor(0, col_x[0], col_x[1], col_x[2]);
        t.setColor(1, col_y[0], col_y[1], col_y[2]);
        t.setColor(2, col_z[0], col_z[1], col_z[2]);
        //光栅化三角形
        rasterize_triangle(t);
    }
}
Rasterization

        将三角形光栅化得到片元,这些片元最终会被渲染成屏幕上的像素。

 FargmentProcessing
        紧随光栅化(Rasterization)之后。在Fragment Processing阶段,主要对光栅化生成的每个片元(Fragment)进行进一步的处理,以确定其最终的颜色、深度和其他属性。而这里的各种属性可以根据线性插值和透视矫正插值得出。作业里要实现的是透视矫正插值。透视矫正插值需要用到重心坐标。重心坐标的计算作业框架中已经直接给出函数,直接调用即可。

        Framebuffer Opeations

        main.cpp这里通过框架的cv库,将frame_buffer的内容写入图片,从而得到最终的图片。

代码:

games101 实验hw2(作业2)_games101作业2-CSDN博客

https://zhuanlan.zhihu.com/p/425153734


http://www.niftyadmin.cn/n/5838180.html

相关文章

SOME/IP--协议英文原文讲解4

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.1.3 End…

冯诺依曼系统及操作系统

目录 一.冯诺依曼体系结构 二.操作系统 三.系统调用和库函数概念 一.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由一…

clean code阅读笔记——如何命名?

命名的原则 1. “小处诚实非小事“ 有个词叫做”以小见大“。以建筑作喻&#xff0c;宏大建筑中最细小的部分&#xff0c;比如关不紧的门、未铺平的地板&#xff0c;甚至时凌乱的桌面&#xff0c;都会将整个大局的魅力毁灭殆尽&#xff0c;这就是整洁代码之所系。 2. 有意义…

OpenCV图像显示imshow()函数——详解

OpenCV图像显示imshow()函数——详解 本文目录&#xff1a; 零、时光宝盒 一、OpenCV 图像显示使用imshow()函数语法 二、imshow()显示图片时发生图片显示不全的解决方法 解决办法&#xff08;1&#xff09; 解决办法&#xff08;2&#xff09; 总结 三、imshow()图像显…

【算法设计与分析】实验1:字符串匹配问题的算法设计与求解

目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 给定一个文本&#xff0c;在该文本中查找并定位任意给定字符串。 1、深刻理解并掌握蛮力法的设计思想&#xff1b; 2、提高应用…

2024年除夕

多少年前的除夕&#xff0c;一如今天这样的除夕&#xff1b;多少年后的除夕&#xff0c;也一如多少年前的除夕。 无数个这样的除夕下午&#xff0c;我打开电脑&#xff0c;望着窗外安静的小区&#xff0c;车声渐渐稀疏的马路&#xff0c;想写下一些新的感受时&#xff0c;多少…

IPhone13 Pro Max设备详情

目录 产品宣传图内部图——后设备详细信息 产品宣传图 内部图——后 设备详细信息 信息收集于HubWeb.cn

ThinkPad E480安装Ubuntu 18.04无线网卡驱动

个人博客地址&#xff1a;ThinkPad E480安装Ubuntu 18.04无线网卡驱动 | 一张假钞的真实世界 遗憾的是虽然下面的方法可以解决&#xff0c;但是内核升级后需要重新安装。 基本信息 Ubuntu 18.04ThinkPad E480使用下面的命令查看 Linux 内核&#xff1a; $ uname -r 5.0.0-3…