Lecture05_光栅化 1(三角形)_GAMES101 课堂笔记——2020.2.25

2023-10-11 21:59

本文主要是介绍Lecture05_光栅化 1(三角形)_GAMES101 课堂笔记——2020.2.25,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今日学习内容概览:

  1. Finishing up Viewing
    • Viewport transformation
  2. Rasterization
    • Different raster displays
    • Rasterizing a triangle

一、透视投影(Perspective Projection)

( 一 )粗略方法:

    确定近平面(l,r,b,t),保持远、近平面不的点变,将远平面变为近平面一样大小:

( 二 )细致处理:

    有时通过垂直的视角(field-of-view,fovY)宽高比(aspect ratio = width / height),(假设对称性即L = -r,B = -t).

( 三 )转换fovY和面为l,r,b,t

计算公式:

\(\tan \frac{fovY}{2} = \frac{t}{|n|}\)             \(aspect = \frac{r}{t}\)

二、规范立方体(Canonical cube)

在 MVP 后,即进行规范立方体到屏幕(画到屏幕)
MYP概念:

  • 模型转换(载置对象)
  • 查看变换(放置相机)
  • 投影变换
    • 正投影(长方体到“规范”立方体\(\left[-1,1 \right]^3\)
    • 透视投影(平截头体到“规范”的立方体)
( 一 )屏幕的定义:
  • 像素的组合
  • 数组大小即为——分辨率 eg:1920*1080
  • 典型的光栅成像设备
( 二 )光栅化和屏幕的关系:
  • Raster == screen in Germa
    • Rasterize == drawing onto the screen
( 三 )像素(Pixel)
  • 可通俗理解为:一个像素就是一个颜色的小正方形
  • 颜色是由 RGB 组合而成
( 四 ) 屏幕空间定义:

    像素的排列:

  • 约定:

    • 像素坐标为(x,y)形式,并且x,y为整数(相当于个数)
    • 像素坐标范围:(0,0)到(宽度-1,高度-1)
    • 像素(x,y)的中心点是(x+0.5,y+0.5)
    • 屏幕占比范围(0,0)到(宽度,高度)
  • 与z无关

  • Transform in xy plane: [-1, 1]2 to [0, width] x [0, height]

  • Viewport transform matrix:

\[M_{viewpoint} = \begin{pmatrix} \frac{width}{2} & 0 & 0 & \frac{width}{2} \\ 0 & \frac{height}{2} & 0 & \frac{height}{2} \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} \]

三、显示设备

( 一 )数控记号笔拉丝机

( 二 )激光切割机

( 三 )不同的光栅显示器
  1. 示波器

  2. 阴极射线管

  3. 电视 - 光栅显示(CRT 显示器的应用)

右边的图像是隔行扫描技术(eg:将画面分为两部分,上半部分扫描奇数行,下半部分扫描偶数行),目前在一些视频压缩中仍有应用。缺点:容易造成画面撕裂,尤其是高速运动(eg:体育运动出现鬼影)

  1. 帧缓存:内存为光栅显示

显存,也被叫做帧缓存,它的作用是用来存储显卡芯片处理过或者即将提取的渲染数据。如同计算机的内存一样,显存是用来存储要处理的图形信息的部件。
DAC——数模转换器,又称D/A转换器,简称DAC,它是把数字量转变成模拟的器件。D/A转换器基本上由4个部分组成,即权电阻网络、运算放大器、基准电源和模拟开关。模数转换器中一般都要用到数模转换器,模数转换器即A/D转换器,简称ADC,它是把连续的模拟信号转变为离散的数字信号的器件。

  1. 平板显示器

视网膜显示器:分辨率已经大于人肉眼的分辨率屏幕。

LCD工作原理示意如下:

LCD——液晶显示器,通过液晶将竖直的光扭转为水平的光。

  1. Electrophoretic (Electronic Ink) Display
    例如:kindle,通过黑白墨水,控制电子号,从而进行显示。缺点:因为改变黑白朝向耗时,因此刷新率低。

三、光栅化:绘图到光栅显示

( 一 )网格
  1. 多边形网格(Polygon Meshes)

  2. 三角形网格(Traingle Meshes)

( 二 )三角形 - 基本形状图元
  1. Why triangles?

    • 最基础的多边形
      • 可由别的多边形拆解而来
    • 独特的性质
      • 保证是平面
      • 能够定义良好的内部
      • 定义方法:可通过定义三角形的三个点,实现渐变效果
  2. 什么像素值近似三角形?

判断一个像素(中心点)与三角形的位置关系===>通过采样实现。
采样:给一个连续函数得到值,即一个函数的离散化过程。

四、采样

    在评估一个点的函数取样。我们可以通过采样离散函数。如下:

for (int x = 0; x < xmax; ++x)output [x] = f(x)

    采样是图形学的核心理念,可以采样的:时间(1D)、面积(2D)、方向(2D)、体积(3D)等等

( 一 )光栅化作为2D采样

例如:如果每个像素的中心是三角形内

定义二元函数:\(inside(tri, x, y)\)(注:X,Y:不必为整数)

光栅化=采样A 2D指示灯功能
for (int x = 0; x < xmax; ++x)for (int y = 0; y < ymax; ++y)image[x][y] = inside(tri,  x + 0.5,  y + 0.5); 

    这个循环函数让像素中心值为 0 或 1 (0表示不在三角形内部,1表示在三角形内部),根据中心点为的值从而给予某种颜色。

( 二 )回顾:样本位置

( 三 )回顾:叉乘


    通过某一点(例如:Q点)与三角形\(P_{0}P_{1}P_{2}\)的边长位置关系做判断。规定某一个方向,以逆时针方向举例,\(P_{2}P_{1} \times P_{2} \times Q\)得知,叉乘指向朝上,因此Q点在\(P_{2}P_{1}\)的右边;同理可得,Q 点在\(P_{1}P_{0}\)的右边,但 Q 点在\(P_{0}P_{2}\)的左边。(点位于三条边的方向并不完全一致)**====》因此,Q点在三角形\(P_{0}P_{1}P_{2}\)的外部。

如果是在像素中心点在边界呢?

    两种方法:一种是不做处理(本堂课采用),另外是做特殊处理。

注:图形学的第三方库API如OpenGL和DirectX对边界点有严格的规定。即中心点在三角形的上边/左边,则算作在三角形内部;若点在三角形的下边/右边,则不属于三角形内部。

检测屏幕中所有的像素


    检测像素的步骤:
1. 首先通过 x,y 的坐标从最小值到最大值选出包围盒(Bounding Box)。(即蓝色包围部分,去掉第一列白色部分。此通过水平和竖直确定的包围盒,还可称为**轴向包围盒=AABB包围盒(Axis-aligned bounding box))**
2. 在区域内进行循环,使用inside函数确定像素中心点的值。

AABB是应用最早的包围盒。它被定义为包含该对象,且边平行于坐标轴的最小六面体。故描述一个AABB,仅需六个标量。AABB构造比较简单,存储空间小,但紧密性差,尤其对不规则几何形体,冗余空间很大,当对象旋转时,无法对其进行相应的旋转。处理对象是刚性并且是凸的,不适合包含软体变形的复杂的虚拟环境情况。
AABB也是比较简单的一类包围盒。但对于沿斜对角方向放置的瘦长形对象,其紧密性较差。由于AABB相交测试的简单性及较好的紧密性,因此得到了广泛的应用,还可以用于软体对象的碰撞检测。

光栅化加速方法之——增量三角形遍历

这种方法是在每一行的从最左到最右,确定一个包围盒。适用于窄长、旋转的三角形(即实际在AABB盒中覆盖了很少的像素。)

( 四 )实际屏幕中的光栅化
  1. 下面是两个手机屏幕的光栅化图像:
  • iPhone :每个像素由3条(RGB)代表一个像素
  • Galaxy :使用\(Bayer Pattern\)方法,使RGB均匀分布。现象:其中绿色点最多(观察方法:只看某一种颜色,分别看三种颜色点,即可看出。)这是因为人眼对绿色更敏感,这样看起来跟舒服。
  1. 彩色打印

如果加的颜色越多,那么会更黑;RGB值越高,图片越亮。

( 五 )按照像素为一个正方形(本课程采用),展示一个示例:
  1. 采样信号展示:

  2. The Display Physically Emits This Signal(进行填充后为左图,实际图形为右图)

    由此,发现一个问题,采样填充后的图像并不完全符合原始图像,出现锯齿(Jaggies)现象。同样的现象见下图:

原因: 因为像素本身具有大小,采样率不高,从而信号走样(Aliasing)。
目前,仍是图形学一直不断改进的问题,下节课将介绍如何解决“锯齿”问题,引入抗锯齿和反走样的概念。

这篇关于Lecture05_光栅化 1(三角形)_GAMES101 课堂笔记——2020.2.25的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/191120

相关文章

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个