GAMES101-Homework2

目录

  • 普通作业:
  • 提高作业:
  • 参考博客
    • 博客一
    • 博客二
    • 博客三
  • 附代码框架的个人一些注释和理解:
    • rasterizer.cpp
    • Triangle.cpp

普通作业:

// 判断点是否在三角形内的辅助函数
static bool insideTriangle(float x, float y, const Vector3f* _v)
{//Vector3f* _v这个参数是一个Vector3f指针,实际上代表的是一个数组。数组中的每个元素是一个Vector3f类型,//也就是代表了一个顶点的坐标。每个点用_v[0],_v[1],_v[2]表示。而每个_v[0]就是一个Vector3f类型的点。// //整个数组代表了多个点。这里一般认为传入的是三个点,即一个三角形。const Eigen::Vector2f P(x, y);// 提取x和yconst Eigen::Vector2f A = _v[0].head(2), B = _v[1].head(2), C = _v[2].head(2);// 计算需求的向量const Eigen::Vector2f AP = P - A;const Eigen::Vector2f BP = P - B;const Eigen::Vector2f CP = P - C;const Eigen::Vector2f AB = B - A;const Eigen::Vector2f BC = C - B;const Eigen::Vector2f CA = A - C;//计算叉积float eq1 = AB[0] * AP[1] - AB[1] * AP[0];float eq2 = BC[0] * BP[1] - BC[1] * BP[0];float eq3 = CA[0] * CP[1] - CA[1] * CP[0];//判断是否同向if (eq1 > 0 && eq2 > 0 && eq3 > 0)return true;else if (eq1 < 0 && eq2 < 0 && eq3 < 0)return true;elsereturn false;// TODO: 实现此函数,检查点 (x, y) 是否在由 _v[0]、_v[1]、_v[2] 表示的三角形内
}
// 屏幕空间光栅化
void rst::rasterizer::rasterize_triangle(const Triangle& t)
{auto v = t.toVector4();int min_x = INT_MAX;int max_x = INT_MIN;int min_y = INT_MAX;int max_y = INT_MIN;//找出包围盒的边界for (auto point : v){if (point[0] < min_x) min_x = point[0];if (point[0] > max_x) max_x = point[0];if (point[1] < min_y) min_y = point[1];if (point[1] > max_y) max_y = point[1];}for (int y = min_y; y <= max_y; y++){for (int x = min_x; x <= max_x; x++){if (insideTriangle((float)x + 0.5, (float)y + 0.5, t.v)){// 如果是这样,使用以下代码获取插值的 z 值。// auto [alpha, beta, gamma] = computeBarycentric2D(x, y, t.v);   C++17以上的版本才可以用此句,否则修改成下面的俩句float alpha, beta, gamma;std::tie(alpha, beta, gamma) = computeBarycentric2D(x, y, t.v);float w_reciprocal = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();z_interpolated *= w_reciprocal;if (z_interpolated < depth_buf[get_index(x, y)]){Eigen::Vector3f p = { (float)x,(float)y, z_interpolated }; //当前坐标set_pixel(p, t.getColor());depth_buf[get_index(x, y)] = z_interpolated; //更新z值}}}}// TODO: 找出当前三角形的边界框。// 遍历像素并查找当前像素是否在三角形内// 如果是这样,使用以下代码获取插值的 z 值。// auto[alpha, beta, gamma] = computeBarycentric2D(x, y, t.v);// float w_reciprocal = 1.0/(alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());// float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();// z_interpolated *= w_reciprocal;// TODO: 设置当前像素(使用 set_pixel 函数)为三角形的颜色(使用 getColor 函数),如果应该绘制的话。
}

提高作业:

MSAA多重采样抗锯齿
这个算法很简单,只要把判断像素中心点在不在三角形内改成判断像素块中的四个采样点在不在三角形内,然后按点在三角形内的比例去改变颜色就行,话不多说看代码更清楚:

void rst::rasterizer::rasterize_triangle(const Triangle& t) {auto v = t.toVector4();int min_x = INT_MAX;int max_x = INT_MIN;int min_y = INT_MAX;int max_y = INT_MIN;for (auto point : v){if (point[0] < min_x) min_x = point[0];if (point[0] > max_x) max_x = point[0];if (point[1] < min_y) min_y = point[1];if (point[1] > max_y) max_y = point[1];}//MSAA:for (int y = min_y; y <= max_y; y++){for (int x = min_x; x <= max_x; x++){float fineness = 0; //创建一个纯度值if (insideTriangle((float)x + 0.25, (float)y + 0.25, t.v)) fineness += 0.25; //改为判断四个采样块的中心点在不在三角形内if (insideTriangle((float)x + 0.25, (float)y + 0.75, t.v)) fineness += 0.25;if (insideTriangle((float)x + 0.75, (float)y + 0.25, t.v)) fineness += 0.25;if (insideTriangle((float)x + 0.75, (float)y + 0.75, t.v)) fineness += 0.25;if (fineness != 0) {auto abg = computeBarycentric2D((float)x + 0.5, (float)y + 0.5, t.v);float alpha = std::get<0>(abg);float beta = std::get<1>(abg);float gamma = std::get<2>(abg);float w_reciprocal = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();z_interpolated *= w_reciprocal;if (z_interpolated < depth_buf[get_index(x, y)]){Eigen::Vector3f p = { (float)x,(float)y, z_interpolated };set_pixel(p, fineness*t.getColor()); //将比例乘给颜色depth_buf[get_index(x, y)] = z_interpolated;}}}}
}

参考博客

博客一

博客二

博客三

附代码框架的个人一些注释和理解:

rasterizer.cpp

// 防止代码格式化
//
// 由 goksu 于 4/6/19 创建#include <algorithm>
#include <vector>
#include "rasterizer.h"
#include <opencv2/opencv.hpp>
#include <math.h>// 将三维向量加载到顶点缓冲区的函数
rst::pos_buf_id rst::rasterizer::load_positions(const std::vector<Eigen::Vector3f>& positions)
{auto id = get_next_id();pos_buf.emplace(id, positions);return { id };
}// 将三维向量加载到索引缓冲区的函数
rst::ind_buf_id rst::rasterizer::load_indices(const std::vector<Eigen::Vector3i>& indices)
{auto id = get_next_id();ind_buf.emplace(id, indices);return { id };
}// 将三维向量加载到颜色缓冲区的函数
rst::col_buf_id rst::rasterizer::load_colors(const std::vector<Eigen::Vector3f>& cols)
{auto id = get_next_id();col_buf.emplace(id, cols);return { id };
}// 将三维向量转换为四维向量的辅助函数
auto to_vec4(const Eigen::Vector3f& v3, float w = 1.0f)
{return Vector4f(v3.x(), v3.y(), v3.z(), w);
}
//------------------补充——————————————————————————
// 判断点是否在三角形内的辅助函数
static bool insideTriangle(float x, float y, const Vector3f* _v)
{//Vector3f* _v这个参数是一个Vector3f指针,实际上代表的是一个数组。数组中的每个元素是一个Vector3f类型,//也就是代表了一个顶点的坐标。每个点用_v[0],_v[1],_v[2]表示。而每个_v[0]就是一个Vector3f类型的点。// //整个数组代表了多个点。这里一般认为传入的是三个点,即一个三角形。const Eigen::Vector2f P(x, y);// 提取x和yconst Eigen::Vector2f A = _v[0].head(2), B = _v[1].head(2), C = _v[2].head(2);// 计算需求的向量const Eigen::Vector2f AP = P - A;const Eigen::Vector2f BP = P - B;const Eigen::Vector2f CP = P - C;const Eigen::Vector2f AB = B - A;const Eigen::Vector2f BC = C - B;const Eigen::Vector2f CA = A - C;//计算叉积float eq1 = AB[0] * AP[1] - AB[1] * AP[0];float eq2 = BC[0] * BP[1] - BC[1] * BP[0];float eq3 = CA[0] * CP[1] - CA[1] * CP[0];//判断是否同向if (eq1 > 0 && eq2 > 0 && eq3 > 0)return true;else if (eq1 < 0 && eq2 < 0 && eq3 < 0)return true;elsereturn false;// TODO: 实现此函数,检查点 (x, y) 是否在由 _v[0]、_v[1]、_v[2] 表示的三角形内
}// 计算二维重心坐标的辅助函数
static std::tuple<float, float, float> computeBarycentric2D(float x, float y, const Vector3f* v)
{// 计算重心坐标float c1 = (x * (v[1].y() - v[2].y()) + (v[2].x() - v[1].x()) * y + v[1].x() * v[2].y() - v[2].x() * v[1].y()) /(v[0].x() * (v[1].y() - v[2].y()) + (v[2].x() - v[1].x()) * v[0].y() + v[1].x() * v[2].y() - v[2].x() * v[1].y());float c2 = (x * (v[2].y() - v[0].y()) + (v[0].x() - v[2].x()) * y + v[2].x() * v[0].y() - v[0].x() * v[2].y()) /(v[1].x() * (v[2].y() - v[0].y()) + (v[0].x() - v[2].x()) * v[1].y() + v[2].x() * v[0].y() - v[0].x() * v[2].y());float c3 = (x * (v[0].y() - v[1].y()) + (v[1].x() - v[0].x()) * y + v[0].x() * v[1].y() - v[1].x() * v[0].y()) /(v[2].x() * (v[0].y() - v[1].y()) + (v[1].x() - v[0].x()) * v[2].y() + v[0].x() * v[1].y() - v[1].x() * v[0].y());return { c1, c2, c3 };
}// 绘制函数,根据指定类型绘制三角形
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;for (auto& i : ind){Triangle t;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)};// 齐次除法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);}
}//------------------补充——————————————————————————
// 屏幕空间光栅化
void rst::rasterizer::rasterize_triangle(const Triangle& t)
{auto v = t.toVector4();int min_x = INT_MAX;int max_x = INT_MIN;int min_y = INT_MAX;int max_y = INT_MIN;//找出包围盒的边界for (auto point : v){if (point[0] < min_x) min_x = point[0];if (point[0] > max_x) max_x = point[0];if (point[1] < min_y) min_y = point[1];if (point[1] > max_y) max_y = point[1];}for (int y = min_y; y <= max_y; y++){for (int x = min_x; x <= max_x; x++){if (insideTriangle((float)x + 0.5, (float)y + 0.5, t.v)){// 如果是这样,使用以下代码获取插值的 z 值。// auto [alpha, beta, gamma] = computeBarycentric2D(x, y, t.v);   C++17以上的版本才可以用此句,否则修改成下面的俩句float alpha, beta, gamma;std::tie(alpha, beta, gamma) = computeBarycentric2D(x, y, t.v);float w_reciprocal = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();z_interpolated *= w_reciprocal;if (z_interpolated < depth_buf[get_index(x, y)]){Eigen::Vector3f p = { (float)x,(float)y, z_interpolated }; //当前坐标set_pixel(p, t.getColor());depth_buf[get_index(x, y)] = z_interpolated; //更新z值}}}}// TODO: 找出当前三角形的边界框。// 遍历像素并查找当前像素是否在三角形内// 如果是这样,使用以下代码获取插值的 z 值。// auto[alpha, beta, gamma] = computeBarycentric2D(x, y, t.v);// float w_reciprocal = 1.0/(alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());// float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();// z_interpolated *= w_reciprocal;// TODO: 设置当前像素(使用 set_pixel 函数)为三角形的颜色(使用 getColor 函数),如果应该绘制的话。
}// 设置模型矩阵的函数
void rst::rasterizer::set_model(const Eigen::Matrix4f& m)
{model = m;
}// 设置视图矩阵的函数
void rst::rasterizer::set_view(const Eigen::Matrix4f& v)
{view = v;
}// 设置投影矩阵的函数
void rst::rasterizer::set_projection(const Eigen::Matrix4f& p)
{projection = p;
}// 清除颜色和深度缓冲区的函数
void rst::rasterizer::clear(rst::Buffers buff)
{if ((buff & rst::Buffers::Color) == rst::Buffers::Color){std::fill(frame_buf.begin(), frame_buf.end(), Eigen::Vector3f{ 0, 0, 0 });}if ((buff & rst::Buffers::Depth) == rst::Buffers::Depth){std::fill(depth_buf.begin(), depth_buf.end(), std::numeric_limits<float>::infinity());}
}// 构造函数,初始化宽度和高度
rst::rasterizer::rasterizer(int w, int h) : width(w), height(h)
{frame_buf.resize(w * h);depth_buf.resize(w * h);
}// 获取索引的函数
int rst::rasterizer::get_index(int x, int y)
{return (height - 1 - y) * width + x;
}// 设置像素颜色的函数
void rst::rasterizer::set_pixel(const Eigen::Vector3f& point, const Eigen::Vector3f& color)
{// 旧的索引:auto ind = point.y() + point.x() * width;auto ind = (height - 1 - point.y()) * width + point.x();frame_buf[ind] = color;
}

Triangle.cpp

//
// Created by LEI XU on 4/11/19.
//#include "Triangle.h"
#include <algorithm>
#include <array>// 初始化三角形的顶点坐标、颜色和纹理坐标为零向量或零值
Triangle::Triangle() {v[0] << 0, 0, 0;v[1] << 0, 0, 0;v[2] << 0, 0, 0;color[0] << 0.0, 0.0, 0.0;color[1] << 0.0, 0.0, 0.0;color[2] << 0.0, 0.0, 0.0;tex_coords[0] << 0.0, 0.0;tex_coords[1] << 0.0, 0.0;tex_coords[2] << 0.0, 0.0;
}
// 设置三角形的顶点坐标
void Triangle::setVertex(int ind, Vector3f ver) {v[ind] = ver;
}
// 设置三角形的法向量
void Triangle::setNormal(int ind, Vector3f n) {normal[ind] = n;
}
// 设置三角形的颜色
void Triangle::setColor(int ind, float r, float g, float b) {if ((r < 0.0) || (r > 255.) ||(g < 0.0) || (g > 255.) ||(b < 0.0) || (b > 255.)) {fprintf(stderr, "ERROR! Invalid color values");fflush(stderr);exit(-1);}// 将颜色值存储为范围在[0, 1]之间的Vector3fcolor[ind] = Vector3f((float)r / 255., (float)g / 255., (float)b / 255.);return;
}
// 设置三角形的纹理坐标
void Triangle::setTexCoord(int ind, float s, float t) {tex_coords[ind] = Vector2f(s, t);
}
// 将三角形的顶点坐标转换为四维向量
//这里transform()是stl算法,作用是将第一个迭代器的元素做op变换之后放到第二个迭代器中,
//最后一个位置的参数代表重载() {}运算符的操作。这里的transform的意思就是将v中vec的xyz存给res
std::array<Vector4f, 3> Triangle::toVector4() const
{std::array<Eigen::Vector4f, 3> res;std::transform(std::begin(v), std::end(v), res.begin(), [](auto& vec) { return Eigen::Vector4f(vec.x(), vec.y(), vec.z(), 1.f); });return res;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/164406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再添千万级罚单,某银行年内罚款过亿!金融行业合规问题亟待解决

11月17日晚间&#xff0c;国家金融监管总局上海监管局披露行政处罚信息显示&#xff0c;某银行因32项违法违规事实收到两张690万元的大额罚单&#xff0c;合计罚款金额达1380万元。但这并不是银行该今年收到的第一张大额罚单。今年4月28日&#xff0c;该行因在结售汇、外币理财…

k8s-pod生命周期 4

容器环境初始化 pod 由pod 镜像来提供&#xff0c;在pod 生命周期里容器主要分为两种&#xff1a;初始化容器和主容器 初始化容器一定要成功运行并退出&#xff0c;当初始化容器运行退出完了之后主容器开始和运行 主容器开始运行的时候&#xff0c;有两个探针&#xff1a;存…

什么是arguments对象?

arguments 对象是 JavaScript 中的一个特殊对象&#xff0c;它包含了函数被调用时传入的所有参数。arguments 对象是一个类数组对象&#xff0c;它有一个 length 属性和按数字索引的元素。 每个函数在执行时都会自动创建一个 arguments 对象。我们可以通过arguments去访问参数…

网络图简单计算规则

单代号进度网络图&#xff08;节点法&#xff09; 概念 计算规则 &#xff08;顺时针计算法&#xff09; &#xff08;TF取之差&#xff09; &#xff08;T&#xff1a;持续时间&#xff09; ES → EF (ES取大EF加T) ↑ T ↑ &#xff08;TF&#xff1a;总时差&…

NOIP2003提高组第二轮T3:加分二叉树

题目链接 [NOIP2003 提高组] 加分二叉树 题目描述 设一个 n n n 个节点的二叉树 tree \text{tree} tree 的中序遍历为 ( 1 , 2 , 3 , … , n ) (1,2,3,\ldots,n) (1,2,3,…,n)&#xff0c;其中数字 1 , 2 , 3 , … , n 1,2,3,\ldots,n 1,2,3,…,n 为节点编号。每个节点都…

【视觉SLAM十四讲学习笔记】第三讲——Eigen库

专栏系列文章如下&#xff1a; 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 本章将介绍视觉SLAM的基本问题之一&#xff1a;如何描述刚体在三维空间中的运动&#xff1f; Eigen…

网工内推 | Base北京,国企网工运维,最高30k*14薪,IE认证优先

01 万方数据股份有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1.负责完成基础网络组网工作&#xff1b; 2.负责网络对象的访问控制及安全策略&#xff0c;配置VLan&#xff0c;黑白名单、地址转换、故障排查及网络安全监控工作&#xff1b; 3.负责对操作系…

Vue框架学习笔记——Vue实例中el和data的两种写法

文章目录 前文提要Vue实例的el第一种写法第二种写法小结 Vue实例中data第一种写法&#xff0c;对象式效果图片第二种写法&#xff0c;函数式效果图片小结 前文提要 本文仅做自己的学习记录&#xff0c;如有错误&#xff0c;请多谅解 Vue实例的el 第一种写法 <body><…

Python图片文件和base64编码互转

图片和base64编码互转 import base64 import cv2# 将图片base64字符串生成图片文件. def base64_to_img(base64_code,save_img_path):"""根据base64生成图片.:param base64_code: 图片的base64文件:param save_img_path: 生成的图片路径:returns: None"&q…

分布式锁之基于mysql实现分布式锁(四)

不管是jvm锁还是mysql锁&#xff0c;为了保证线程的并发安全&#xff0c;都提供了悲观独占排他锁。所以独占排他也是分布式锁的基本要求。 可以利用唯一键索引不能重复插入的特点实现。设计表如下&#xff1a; CREATE TABLE tb_lock (id bigint(20) NOT NULL AUTO_INCREMENT,…

(二)C语言之变量与算数运算表达式概述

C语言之变量与算数运算表达式概述 一、华氏温度与摄氏温度对照二、代码概述三、练习 一、华氏温度与摄氏温度对照 #include <stdio.h>/*当华氏温度为 0,20,40,...300时&#xff0c;打印出华氏温度与摄氏温度对照表华氏温度与摄氏温度 C(5/9)(̧F-32) 其中C表示摄氏温度&…

顺序栈和链栈

#include<iostream> using namespace std; #define MAXSIZE 100 typedef int SElemType; typedef struct { SElemType* base; SElemType* top; int stacksize; }SqStack;//顺序栈 //构造一个空栈 int InitStack(SqStack& s) { s.base new SElemType…

Django之中间件与CSRF_TOKEN

文章目录 一、什么是中间件二、中间件有什么用三、Django自定义中间件中间件中主要方法及作用创建自定义中间件的步骤&#xff1a;process_request与process_response方法process_view方法process_exceptionprocess_template_response&#xff08;不常用&#xff09; 四、CSRF_…

mysql latin-1报错解决

conn pymysql.connect(hostmeta_conf[host], usermeta_conf[user], passwordmeta_conf[password], portmeta_conf[port], charsetutf8) 光把表声明 ENGINEINNODB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_bin ROW_FORMATDYNAMIC 并不能解决这个报错,需要在创建mysql连接时候…

面试:RabbitMQ相关问题

文章目录 简单介绍RabbitMQRabbitMQ架构什么是 RabbitMQ&#xff1f;有什么显著的特点&#xff1f;RabbitMQ 有那些基本概念&#xff1f;RabbitMQ routing 路由模式消息怎么路由&#xff1f;RabbitMQ publish/subscribe 发布订阅(共享资源)能够在地理上分开的不同数据中心使用 …

vue2指令的使用和自定义指令

前言 个人认为vue的指令,对比react来说,给开发者节省了很大的学习成本。比如在react中,你想渲染一个列表,需要用Array.map的方法return<div>,而在vue中,一个简单的v-for就解决了问题。 在学习成本和入手体验上,vue的作者确实后来者居上,能让人更快的使用vue开发。不过也…

无边界电视点播TVbox壳+源

TBBox可以是个盒子也可以是软件 视频播放的困局新的改变TVBox apk更成熟的熊猫宝盒_3.10还有这个没测试恒星TV 写在最后 视频播放的困局 现在电视上几大平台看剧集都要充会员&#xff0c;而电脑上网页端有很多可以看的网页&#xff0c;只有 随便一搜就测出来&#xff0c;只是经…

数据安全第一:应对[[MyFile@waifu.club]].wis勒索病毒的实用建议与技巧

引言&#xff1a; 在当今数字化时代&#xff0c;[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis勒索病毒是一种恶意软件&#xff0c;其危害用户数据安全&#xff0c;通过加密文件并勒索赎金来获取经济利益。以下是对[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis…

PyTorch包

进入PyTorch的官网&#xff1a; pytorch GitHub 点击GitHub&#xff1a; 进入PyTorch的主目录&#xff1a; 进入Vision reference&#xff1a; detection&#xff1a; 这就是我们在训练过程中会使用到的文件了&#xff1a;

objdump反汇编文件解析

命令使用 objdump可以对可执行文件进行反汇编 其常用参数为: objdump -d <file(s)>: 将代码段反汇编&#xff1b;objdump -S <file(s)>: 将代码段反汇编的同时&#xff0c;将反汇编代码与源代码交替显示&#xff0c;编译时需要使用-g参数&#xff0c;即需要调试信…