GAMES101 Assignment 3

news2025/7/10 5:49:55

前言

通过阅读实验提供的代码框架,可以加深对渲染管线的理解。assignment1,2我并没有做,我们课程图形学本来有实验计划,然而老师专门让我们做GAMES101的这个实验,其意义可见一斑。
阅读过程中遇到许多困难,看了许多资料以及平台的论坛,很受启发,重要资源附在文末。

实验目的

在这里插入图片描述

实验内容

在这里插入图片描述
在这里插入图片描述
第②点讲错了,一开始把这个点错理解为视点,它就是模型的顶点,后面用来插值得到渲染点的shadingcoords.

在这里插入图片描述
在这里插入图片描述
细心的朋友会发现一些问题。code 中用投影后的点计算重心坐标,通过几步运算得到插值点的深度(z坐标),然后依次插值得到颜色、法线、纹理坐标以及 shadingcoords.
首先,shadingcoords是什么?
它是要渲染点(在 shader 中就是红色圈出来的点)在相机坐标系下的坐标,通过仅经过mv变换(代码中有体现)的三角形顶点插值得到。
在这里插入图片描述

为什么深度的插值计算和其他属性不同?
投影前后,重心坐标会发生变化,进行属性插值按理使用投影前的重心。那么我们如何计算投影前的重心?

透视矫正插值

在这里插入图片描述
对蓝色三角形进行齐次变换 M M M得到红色三角形,设 K = A , B , C , P K={A,B,C,P} K=A,B,C,P,有
[ K ′ w k w k ] = M [ K 1 ] \begin{bmatrix} K'w_k \\ w_k \end{bmatrix}=M \begin{bmatrix} K \\ 1 \end{bmatrix} [Kwkwk]=M[K1]
注意到在进行齐次除法时保留了 w k w_k wk. 设点 P 变换前后重心坐标为 ( α , β , γ ) (\alpha,\beta,\gamma) (α,β,γ)以及 ( α ′ , β ′ , γ ′ ) (\alpha',\beta',\gamma') (α,β,γ),满足
P = α A + β B + γ C P ′ = α ′ A ′ + β ′ B ′ + γ ′ C ′ P=\alpha A+\beta B+\gamma C \\ P'=\alpha' A'+\beta' B'+\gamma' C' P=αA+βB+γCP=αA+βB+γC
利用 α + β + γ = 1 \alpha+\beta+\gamma=1 α+β+γ=1构建等式,建立变换前后重心坐标的关系:

在这里插入图片描述
但是现在是已知投影后的重心坐标,因此应该用 α ′ , β ′ , γ ′ \alpha',\beta',\gamma' αβ,γ表示 α \alpha α,已知 α ′ = α w a k \alpha'=\alpha w_ak α=αwak,尝试将 k k k α ′ , β ′ , γ ′ \alpha',\beta',\gamma' αβ,γ表达即可:
在这里插入图片描述
Z变量 对应的正是公式中 k因此深度是通过透视矫正插值精确计算的,而其他属性是通过投影后重心坐标简单近似插值计算的。
看这个回帖:
在这里插入图片描述
帖子:https://games-cn.org/forums/topic/zuoye3-interpolated_shadingcoords/
截图材料:https://www.cs.ucr.edu/~craigs/courses/2018-fall-cs-130/lectures/perspective-correct-interpolation.pdf

auto tup = computeBarycentric2D((float)x + 0.5, (float)y + 0.5, t.v);
float alpha, beta, gamma;   // 利用重心坐标进行属性插值
std::tie(alpha, beta, gamma) = tup;
float Z = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
float zp = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();
zp *= Z;    // 深度
if (zp < depth_buf[get_index(x, y)])
{
    // 近似插值
    auto interpolated_color = interpolate(alpha, beta, gamma, t.color[0], t.color[1], t.color[2], 1);
    auto interpolated_normal = interpolate(alpha, beta, gamma, t.normal[0], t.normal[1], t.normal[2], 1).normalized();
    auto interpolated_texcoords = interpolate(alpha, beta, gamma, t.tex_coords[0], t.tex_coords[1], t.tex_coords[2], 1);
    auto interpolated_shadingcoords = interpolate(alpha, beta, gamma, view_pos[0], view_pos[1], view_pos[2], 1);

在这里插入图片描述
在这里插入图片描述
后面两个shader还未理解原理,坑。

实验结果

在这里插入图片描述

More

山东大学图形学课程实验代码获取:Here

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

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

相关文章

线性杂双功能PEG试剂Biotin-PEG-Silane,Silane-PEG-Biotin,生物素-PEG-硅烷

英文名称&#xff1a;Biotin-PEG-Silane&#xff0c;Silane-PEG-Biotin 中文名称&#xff1a;生物素-聚乙二醇-硅烷 生物素-PEG-硅烷是一种含有生物素和硅烷的线性杂双功能PEG试剂。它是一种有用的带有PEG间隔基的交联或生物结合试剂。生物素能与亲和素和链霉亲和素结合&…

多期DID和事件研究法含文献和do代码

多期DID和事件研究法含文献和do代码 1、方法&#xff1a;多期DID 2来源&#xff1a;JDE发表的一篇多期DID和事件研究法相关的文章&#xff0c; 文章名为为"Here waits the bride? The effect of Ethiopias child marriage law"。 3、数据内容&#xff1a;数据包…

钱为什么会贬值?

一、什么是钱贬值&#xff1f; 当我们在谈钱贬值的时候&#xff0c;我们是在说什么&#xff1f; 是指的今天5块钱可以买5个苹果&#xff0c;1个月后5块钱只可以买3个苹果.&#xff08;以商品为评价基准&#xff09; 是指的今天1美元可以换6元人民币&#xff0c;1个月后1美元…

数据库实验5 数据库设计实验

前言&#xff1a;不知道啥原因&#xff0c;最后设计出来少了一个表&#xff0c;无语 实验5 数据库设计实验 1.实验目的 掌握数据库设计基本方法及数据库设计工具。 2.实验内容和要求 掌握数据库设计基本步骤,包括数据库概念结构设计、逻辑结构设计,物理结构设计,数据库模式…

Flarum部署:从源码到docker到放弃

警告&#xff1a; 此篇文章前半段记录了我用代码部署flarum遇到的一些问题和解决办法&#xff0c;但是可能是由于我是在不熟悉php的框架结构&#xff0c;最终我还是选择了使用docker进行部署&#xff0c;请斟酌是否继续阅读本文。 Hello&#xff0c;大家好&#xff0c;我是内网…

开源项目-OA自动化管理系统

哈喽&#xff0c;大家好啊&#xff0c;今天给大家带来一个开源系统-办公自动化管理系统 简介: OA( Office Automation System)办公自动化系统是一个企业用来管理日常事务的系统&#xff0c;它一般用来管理各种流程&#xff08;报销、请假. . .&#xff09;审批&#xff0c;通讯…

Fabric.js 元素中心缩放

本文简介 点赞 关注 收藏 学会了 使用 fabric.js 创建的图形&#xff0c;默认的缩放原点是元素操作点的对角点。 如下图所示&#xff1a; 如果按住 alt 键 操作会把原点移动到元素中心。 如下图所示&#xff1a; 如果想将默认缩放操作设置为“中心缩放”&#xff0c;只需…

ImportError: DLL load failed while importing etree: 找不到指定的模块。

目录标题前言错误描述报错代码如下&#xff1a;原因&#xff1a;解决办法前言 今天我正在悠闲的逛着网站寻找今天要爬取的目标当我找到目标的时候正要创建我的scrapy爬虫文件的时候竟然报错了我很惊讶&#x1f62e;&#x1f62e;&#x1f62e;&#xff01;&#xff01;&#x…

安全分析模型核心服务部署

安全分析模型核心服务部署 ModelOps 对所有的人工智能 模型&#xff08;图形模型、语言模型、基于规则的模型&#xff09;以及决策模型的整个生命周期 进行管理&#xff0c;确保对生产中的所有模型进行独立验证和问责&#xff0c;其核心功能涵盖了模型存储、模型测试、模型回滚…

非零基础自学Golang 第15章 Go命令行工具 15.6 性能分析 15.6.1 安装Graphviz

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.6 性能分析15.6.1 安装Graphviz第15章 Go命令行工具 15.6 性能分析 性能分析和调优是一种强大的技术&#xff0c;用于验证是否满足实际性能要求。 Go语言支持使用go tool pprof工具进行性能查看及调优。…

DNS协议分析

上一篇文章从工作原理角度分析了DNS的作用与意义&#xff0c;这次来看看DNS到底是以什么形式进行通信的。 DNS报文格式如下所示&#xff1a; DNS报文由12字节长的首部和4个长度可变的字段组成。 1.标识&#xff0c;由主机端设置&#xff0c;为的是唯一标识当前DNS报文。 2.1…

关于Docker入门

目录 1.Docker简介 2.Centos7安装Docker 3.Docker HelloWorld运行原理解析 4.阿里云镜像仓库 5.Docker命令 Docker基本命令 Docker镜像常用命令 Docker 容器常用命令 1.Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从Apache2.0协议开源 Doc…

Vue3——vuex的使用——axios网络请求的使用

vuex作用&#xff1a;用来集中式管理数据 集中式的应用&#xff0c;当前有四个组件A,B,C,D&#xff0c;假如现在有一个数据x在A里面&#xff0c;现在其他三个组件都要用到x并且好要修改x的时候&#xff0c;有一种方法就要用到全局事件总线&#xff0c;如下图所示 像上面这样不…

用于生成随机曲面的Matlab程序(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 本文在总结、分析现有随机图形生成方法的基础上&#xff0c;结合自由形状的造型技术、自适应神经网络的自适应学习机理&#x…

科研人快速入门LaTex到日常使用,下载安装配置,语法使用说明等

1 前言 Latex是一款开源免费并且应用相当广泛的排版工具&#xff0c;被⼴泛运⽤在各个⾏业&#xff0c;⽐如学术界、出版界。LaTeX 和 Word 相比&#xff0c;LaTeX 入门者更能写出漂亮的文档。它不但能对文字、公式、图片进行精确而复杂的排版&#xff0c;并且还能保证全文各个…

【OpenFeign】【源码+图解】【四】FeignClient实例工具类ReflectiveFeign

【OpenFeign】【源码图解】【三】FeignClient的配置信息 目录5. FeignClient实例工具类ReflectiveFeign5.1 增强Builder属性5.1.1 Capability5.2 创建ReflectiveFeign5. FeignClient实例工具类ReflectiveFeign 上文中调用了targeter.target(this, builder, context, target)&a…

【GO】 K8s 管理系统项目[API部分--Node]

K8s 管理系统项目[API部分–Node] 1. 接口实现 service/dataselector.go type nodeCell corev1.Nodefunc(n nodeCell) GetCreation() time.Time {return n.CreationTimestamp.Time }func(n nodeCell) GetName() string {return n.Name }2. Node功能 service/node.go 2.1 重…

基于Servlet 的Java Web项目的CSRF防御概念

本篇创建一个基本的Jave Web 项目, 使用Servlet提供服务, 使用Filter 处理CSRF防御。 演示环境 Java 1.8.0_211Eclipse 2021-06 (4.20.0)Maven 3.6Servlet 创建与运行 在Eclipse 中创建一个简单的Maven 项目, 项目名为 java-web,如下图: 创建完成的项目目录结构如下: 创…

pre compile header

预编译头文件存在的目的是减少一个项目中不经常改动的文件的编译次数&#xff1b; 打个比方&#xff1a;c标准库&#xff0c;当我们在项目中调用一个c标准库的时候&#xff0c;这个库一般是只读的&#xff0c;所以我们没必要每次编译项目的时候都recompile c标准库&#xff1b…

预约挂号系统技术点详解(二)

一、微服务间服务的调用介绍 1. 需求&#xff08;医院接口远程调用数据字典&#xff09; service-hosp服务调用service-cmn服务 2. 实现步骤 ⑴ 搭建service-client父模块 修改pom文件&#xff0c;添加需要使用的model模块和工具模块依赖&#xff0c;并添加openfeign依赖 …