心怀希望の光栅化

还记得什么是光栅化咩?

0191ae539b9949539e973442a92e195f.png

将三维空间的几何形体显现在屏幕上,这就是光栅化(游戏、实时图形学的应用)

Perspective Projection

在正交投影里如何定义三维空间中的立方体呢?

用x轴的覆盖(左、右),y轴的覆盖(上、下),z轴的覆盖(远、近)

远近用正交投影和透视投影都是一样的,在做透视投影的时候,是需要把视锥变成长方体

那我们如何定义这样一个视锥呢?

382fd5d273ab4ff186d25678b77533f4.png

从摄像机出发,看向某一个区域,看到的近平面为其定义宽度和高度,就像是看显示器一样,定义一个宽高比,那什么是宽高比呢?

宽高比,顾名思义,它的宽度除以它的高度,即视图区域可看到的长宽比

我们还需要一个定义:视角(可看到的角度的范围,垂直可视角度,广角就是指垂直可视角度较大)

由长宽比和垂直可视角度可以推出水平可视角度

把摄像机摆放到某各个位置,向一个方向看,如果从侧面看可以看到这样的三角形,右面的线和摄像机距离是eq?%7Cn%7C,我们已知垂直可视角度,可视角度是上下两条连线的夹角,垂直可视角度/2是三角形张开的角度,可得出两个公式:

93795aae9713453a93aedab131ba280a.png

定义视锥:定义垂直可视角度、定义宽高比 

可以自动转化到定义正交投影的远近、左右、上下

根据前置内容,所有东西都可以转化到这样一个立方体上:

a1e003bea3e24c03b3ae6614fd6a3379.png

我们如何将这个立方体画到屏幕上呢?

既然要画到屏幕上那就先明确屏幕的定义,在计算机图形学中,屏幕被定义成一个二维的数组,数组中的每一个元素被定义成一个像素,像素的多少可以组成分辨率的概念

屏幕是典型的光栅成像设备,光栅即屏幕,把东西画在屏幕上就是光栅化的过程

像素:picture element(居然真的是像素。。。),像素是最小的单位,在里面不会有变化

3f102198f6dd4ec28a1358228482b82e.png

透视投影转化成正交投影需要保证近和远两个平面是不变的,大小是近远两平面都会变得和近平面一样大

Canonical Cube to Screen

52d837d608d94babb54e23dbc45ef433.png

 定义像素坐标,均写成eq?%28x%2Cy%29形式,用整数坐标描述,比如现在的蓝色像素可以用eq?%282%2C1%29表示(从0开始数),屏幕的分辨率从eq?%280%2C0%29开始一直到eq?%28width-1%2Cheight-1%29,像素的中心是eq?%282.5%2C1.5%29,从三维空间到屏幕变换(立方体映射到屏幕空间):

233b67ff105a442095176cc99103e82a.png

有z怎么办呢? 

z先不用管,后面有它的用途,至于x和y,将这个拉成宽度是width,高度是height,因为-1~1是2,所以需要先/2再×对应的高度或者宽度,我们要把屏幕空间的左下角定义到原点上,也就是说原来的中心是eq?%280%2C0%29那需要把它移到该在的位置上,这个变换被称为视口变换

69e37229eb6b406c8af6b3967e0b7f2c.png

 下一步我们要把空间中描述的信息变成真正的图,即打散成像素

77341f6395a0463bba56f0e8970739b8.png

 在《少年派的奇幻漂流》中的老虎栩栩如生,这是图形学的贡献,老虎身上有很多多边形,经历了变换操作后会形成在屏幕中的多边形,要进一步把多边形打碎成像素显示在屏幕上,知晓每一个像素的值都是什么,这个过程叫做光栅化

图像不止可以显现到屏幕上,还有一些其他的绘画工具

Drawing Machine

机器人的机械臂?:

激光切割:

Different Raster Displays

示波器:示波器本身也是成像的设备,它成像的原理和早期的显示器基本相同,电子经过阴极射线管加速打到屏幕上(CRT屏幕)

采用扫描的方式控制打印的位置,(隔行扫描,画每张图工作量减少一半,但对高速运动的画面容易造成画面撕裂)隔一行一条线,当足够密集的时候就足以覆盖整个屏幕:

 

显示器🖥通过显卡(内存中的一块区域映射到屏幕上):

高分辨率显示器,有些甚至分辨率超过了人的视网膜的分辨率(视网膜屏幕):

LCD(液晶显示器)利用液晶的原理控制显示

液晶通过自己的排布影响光的偏振方向(极化),两个光栅不同方向排布

LED发光二极管:

墨水屏刷新有点慢,但是挺自然

三角形表示能力很强,可以表示很多二维三维中的图形:

 

为什么三角形在图形学中得到了如此广泛的应用呢? 

 

首先三角形很简单,任何东西多可以拆分成三角形,内部一定是平面的,内外很清晰,只要定义了三角形的三个顶点,可以明确的知道差值:

判断像素和三角形的位置关系是光栅化中很重要的一环,像素内部是不能有颜色变化的,那盖住一半的像素该怎么办?

那就考虑像素中心点与三角形的位置关系呗:

 

 

 

最简单的光栅化方法:采样,那么我们如何进行这样的采样呢?

可以这样遍历一个二维数组:

 inside是定义的一个函数,判断点是否在三角形内(可以做叉积):

 那如果给定点恰好在三角形的边界怎么办?

那就要么不做处理,要么特殊处理(计上不计下,计左不计右)

通过采样进行光栅化:

有的点不可能触碰到三角形,三角形根本不可能填充到这些像素上,蓝色区域:三角形的包围盒

每一行都找最左和最右(包围盒较大时比较适用):

实际屏幕效果:

 

绿色像素多一点(人眼对绿色更为敏感,红:蓝:绿=1:1:2) 

我们仍然认为像素是一个内部颜色均匀的小方块:

 

采样后对应像素发现不太对:

可是我们想要的不是这个吗?

这锯齿太明显了吧?造成这个的结果呢就是因为锯齿,锯齿是图形学中致力解决的一个问题,采样率对于信号来说不够高:走样

抗锯齿、反走样是图形学中的一个重要技术

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

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

相关文章

【UML用户指南】-02-UML基本元素的介绍(二)

目录 1、语法和语义规则 2、UML中的公共机制 (1)规约 (2)修饰 (3)通用划分 (4)扩展机制 衍型/版型/类型(stereotype) 标记值 (tagged val…

Java编程常见问题汇总四

系列文章目录 文章目录 系列文章目录前言一、忽略所有异常二、重复包装RuntimeException三、不正确的传播异常四、用日志记录异常五、异常处理不彻底 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…

[C/C++]_[初级]_[在Windows和macOS平台上导出动态库的一些思考]

场景 最近看了《COM本质论》里关于如何设计基于抽象基类作为二进制接口,把编译器和链接器的实现隐藏在这个二进制接口中,从而使用该DLL时不需要重新编译。在编译出C接口时,发现接口名直接是函数名,比如BindNativePort,怎么不是_BindNativePort?说明 VC++导出的函数默认是使…

Google Earth Engine精度评价方法

今天讲讲如何在GEE中做最后的精度评价。主要是因为在和许多读者或通过交流群,或通过私聊沟通过程中,发现很多人还不是很理解在GEE中分类后精度评价的问题。 在进行评价之前,需要明晰在GEE中精度评价分为哪几种情况。我们这里说的是两种情况。…

收藏品NFT的开发流程

开发收藏品NFT的流程涉及多个阶段,从概念化和设计到技术实现和市场推广。以下是详细的开发步骤,通过这些步骤,可以成功开发和发布收藏品NFT项目,吸引用户和投资者,并确保项目的持续运营和成功。北京木奇移动技术有限公…

Fiddler入门(接口抓包及APP测试)

目录 一、Fiddler基础介绍 二、Fiddler的作用 三、Fiddler安装 四、Fiddler界面功能介绍 1、界面介绍 1)、菜单栏介绍 2)、工具栏介绍 3)、会话栏介绍 五、Fiddler抓取https数据 (面试题) 六、Fiddler…

【刷题(17)】技巧

一 技巧基础 二 136. 只出现一次的数字 1 题目 2 解题思路 哈希表map 其实看到题目数组中某个元素出现的次数也可以直接用unordered_map容器统计每一个元素出现的次数,然后在遍历整个map容器查看是否有元素出现的次数等于1 3 code class Solution { public:in…

商城项目【尚品汇】07分布式锁-2 Redisson篇

1 Redisson功能介绍 基于自定义setnx实现的分布式锁存在下面的问题: 重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,他的方法都是使用…

将HTML页面中的table表格元素转换为矩形,计算出每个单元格的宽高以及左上角坐标点,输出为json数据

export function huoQuTableElement() {const tableData []; // 存储表格数据的数组let res [];// 获取到包含表格的foreignObject元素const foreignObject document.getElementById(mydctable);if (!foreignObject){return ;}// 获取到表格元素let oldTable foreignObject…

Nativefier : 将网址打包成exe桌面程序

1、需求场景 在日常开发中,需要针对一些网页在一体机上使用,同时在浏览器上也可以使用,这里推荐大家用nativefier,对网址进行打包。以下是nativefier安装命令: npm install nativefier -g 2、使用方法 --arch 系统 …

《混凝土坝监测仪器系列型谱》修订中监测仪器分类方案解读

随着科技的不断进步和监测需求的日益增加,对监测仪器分类方案进行修订已成为必然的趋势。本文旨在探讨《混凝土坝监测仪器系列型谱》中对现有仪器分类方式的修订,以及监测仪器选用的相关内容。希望对大家中有所帮助: 一、取消过时条目&#x…

java中方法引用

目录 方法引用: 引用静态方法 引用成员方法 引用构造方法 使用类名引用成员方法 引用数组的构造方法 练习 方法引用: 把已经有的方法拿过来用,当做函数式接口中抽象方法的方法体 在Java中,方法引用是一种简化Lambda表达式的…

教务管理系统-学员办理体系介绍

随着时代的快速开展,教育方面也没落下,不仅是线下线上都呈现许多训练校园,办理软件也顺势而为的呈现广阔训练校园面前,许多的校园和训练组织也都在运用教务管理系统了。运用教务管理系统里边的学员办理体系可以让相应的办理人员更…

Redis的一致性

一、产生的原因 使用缓存,在进行写操作的时候就会出现不一致的问题。 一致性分为三类:强一致性,弱一致性,最终一致性 二、方案 2.1 延时双删 在更新数据库的操作前后分别进行一次删除缓存的操作,并在更新数据库之后…

《HelloGitHub》第 98 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、…

容器化部署fastdfs文件存储

目录 一、软件信息 二、构建fastdfs镜像 三、docker 启动fdfs服务 四、k8s部署fdfs服务 1、fdfs部署文件 五、外部服务访问 一、软件信息 fastdfs版本:fastdfs:V5.11 libfastcommon版本: V1.0.36 fastdfs-nginx-module版本:V1.20 nginx版本&…

使用Spring Boot和MybatisPlus的Java CRM客户关系管理系统源码

项目名称:CRM客户关系管理系统 功能模块及描述: 一、待办事项 今日需联系客户:显示当日需跟进的客户列表,支持查询和筛选。 分配给我的线索:管理分配给用户的线索,包括线索列表和查询功能。 分配给我的客…

导弹研究中常用坐标系及坐标系之间的变换

在导弹飞行控制过程中,需要时刻掌握导弹的飞行状态 (速度、位置、姿态角等),这就有赖于描述导弹飞行状态的坐标系。除了大地坐标系和地心大地直角坐标系外,导弹常用的坐标系还有很多,合理而恰当地选择参考系…

37【透视】两点透视

1 两点透视比较合适表现物体的结构 用两点透视绘制比较小的、箱子之类的物体 2 一点透视和两点透视的共存关系

vs - vs2013/vs2019工程文件的区别

文章目录 vs - vs2013/vs2019工程文件的区别概述笔记sln文件的区别VisualStudioVersion vcxproj文件的区别ToolsVersionPlatformToolset 备注更方便的方法END vs - vs2013/vs2019工程文件的区别 概述 为了避免安装UCRT的问题,想将手头的vs2019工程降级为vs2013工程…