【Scratchapixel】坐标系变换、光栅化_scratchapixel系列-程序员宅基地

技术标签: 图形学理论  

坐标系变换(理论)

在这里,我们不碰齐次坐标,不碰w分量,从理论上来看看图形学中的坐标变换和光栅化。

Local -> world -> camera -> projection -> NDC -> screen

 

Local, World, Camera coord: 只是分别以local, world, camera为原点的一个直角坐标系(笛卡尔坐标系)。

projection coord: 将三角形三个点的x, y执行透视除法投至画布(投影面),z取反。(因为在camera坐标系中,z是负的)

NDC: 标准化坐标系。将三个点的x, y 分别从【l, r】和 【b, t】缩放至【-1, 1】。其中【l, r】为画布的左右边x坐标,【b, t】为画布的下上边y坐标。(这4个数是在定义视锥体后自动算出的)

Screen coord: 先将三个点的x, y从NDC变换到【0, 1】(加1再除以2),再乘以频幕分辨率。

如果感觉哪里不清楚,请移步至原作者:https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation

 

坐标系变换(OpenGL)

大体上和理论的过程差不多,只不过在OpenGL(包括D3D)里,是通过矩阵乘法来实现的。而矩阵必须是4×4的(否则构造不出平移矩阵),因此将三维的笛卡尔坐标系扩充至四维的齐次坐标系。对应关系如下:

齐次坐标系(x, y, z, w)

笛卡尔坐标系(x/w, y/w, z/w)

坐标系转换如下:

Local -> world -> camera -> clip -> NDC -> screen

可以看到在projection coord被替换为clip coord。

前三个坐标系也变成齐次坐标系,只不过w设为1。到clip坐标系时,w就不是1了。

这里有个小trick:在构造投影矩阵(camera -> clip的矩阵)时,先把NDC的样子写出来,再构造矩阵。

即:投影矩阵将camera space的齐次坐标变换到NDC坐标所对应的齐次坐标。

所以,vertex shader里的gl_Positon 是 NDC坐标(笛卡尔系)对应的齐次坐标。

原文详见http://www.songho.ca/opengl/gl_projectionmatrix.html#perspective

 

 

光栅化

现在,我们有了三个点的屏幕坐标(0<=x<=1920, 0<=y<=1080,浮点型),开始进行光栅化。(rasterization)

 

根据三个点的屏幕坐标,确定bounding box。(整数)。

遍历像素点。对于某个像素点,有:

               取其中心坐标(如:第100列第20行的像素点,则取p =(100.5, 20.5)),并用之与三个点的x, y进行edgeFunction(判定点p是否在三角形内部),在此可顺便算出p的重心坐标/权重(w0, w1, w2)。重心坐标可用来插值(像素的)颜色和深度值。

先插出深度值,再结合深度值插颜色。

深度值插法:即为该像素的深度值。

颜色插法:。很好理解:越远的地方(深度值越大的地方)颜色贡献越小,所以C除以一下深度值Z。

 

反走样

一个直观的反走样方法,就是将一个像素分成几个小像素,对每小像素采样。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33065041/article/details/99976641

智能推荐

Android学习笔记(一):Android基础_安卓学习笔记-程序员宅基地

文章浏览阅读2k次。Android基础学习_安卓学习笔记

Ubuntu下安装Android Studio_ubuntu安装android studio-程序员宅基地

文章浏览阅读2.7w次,点赞21次,收藏147次。一、系统环境系统环境二、安装源文件Android Studio 3.2.0: android-studio-ide-181.5014246-linux.zipJava SE Development Kit:jdk-8u221-linux-x64.tar.gz提取码:17xx三、安装JDK解压JDK:sudo tar -zxvf jdk-8u221-linux-x64.tar.gz -C /opt配置环境变量:sudo gedit /etc/profile文..._ubuntu安装android studio

Python教学 | Python 内置函数_python是否有内置方法计算ploygon的库-程序员宅基地

文章浏览阅读157次。本文要介绍的 Python 内置函数属于核心语言的一部分。我们在介绍数据类型、控制结构的文章中已经逐渐学习了 Python 的基本语法,不过还是需要一个时机去学习 Python 中零落无序的内置函数,这就是本期文章的目的。Python 官方提供了 68 个内置函数,这些内置函数主要提供简单且基础的功能,实用性高。需要提醒的是,我们在使用自定义函数时,应该尽量避免函数名与内置函数的名称一样,否则有可能导致程序异常。下面我们以处理数据为目的,分类别向大家介绍 Python 中常用的内置函数。_python是否有内置方法计算ploygon的库

二维海浪波数谱的matlab,常见海浪谱-程序员宅基地

文章浏览阅读3.3k次。郭桓丞 研一19021210883海浪运动是海洋中一种常见的现象。对于瞬息万变的海洋来讲,海面的波动现象十分复杂,由于前期研究人员通过大量的实测数据模拟出符合实际情况的海谱密度函数,通过不同的建模方法对海面进行几何建模,来满足不同类型海面研究需要。研究人员可以根据研究内容的不同来选择合适的模型。海谱模型主要是通过对在海上获取的实验数据拟合而得到的,它是研究海面模型、电磁散射模型和海面回波仿真的基础..._pm海谱怎么画

SK5搭建_sk5搭建脚本-程序员宅基地

文章浏览阅读2.6w次。下面是两个教程的链接腾讯云搭建Socks5多IP代理服务器https://blog.csdn.net/weixin_44471270/article/details/86184185Proxifier实现指定进程代理IPhttps://blog.csdn.net/weixin_44471270/article/details/86225073腾讯云更廉价的是学生云,但是9月多的时候腾讯改..._sk5搭建脚本

MYSQL的COMPACT行格式讲解-程序员宅基地

文章浏览阅读962次,点赞28次,收藏9次。MySQL 5.6.6之后,mysql的数据默认存放到 .ibd后缀的文件(独占表空间文件) 中。

随便推点

受够了百度网盘?如何注册无限容量的Google Drive网盘_googledrive注册教程-程序员宅基地

文章浏览阅读4.9w次,点赞15次,收藏136次。几天前,我解锁过一个get谷歌网盘的姿势。无限存储空间,还能变成1EB的电脑硬盘。那个姿势,很方便。先打一针,以下全程需要特殊上网方式网络,能打开谷歌那种网络。first,去虚拟身份网站。地址:https://www.fakenamegenerator.com/advanced.php?t=country&amp;n[]=us&amp;c[]=us&amp;gen=50&amp;age-..._googledrive注册教程

【爬取微信公众号图片生成Word or PPT】_用python实现将微信公众号图片下载并保存到ppt中-程序员宅基地

文章浏览阅读221次。将微信公众号上的推文(主要是指图文类的学习资料)爬取下来整合成word或者ppt格式文档。_用python实现将微信公众号图片下载并保存到ppt中

如何挑选自媒体平台进行创作?这3个关键需要把握_服务号的创作平台怎么选-程序员宅基地

文章浏览阅读301次。大多数爆款文章,并非灵感迸发,一挥而就,而是通过不断修改方能产生。想要提高过稿的可能性,你必须沉下心进行不断修改,保证文章的原创度,建议大家可以在创作完之后使用易撰进行文章质量检测,帮助你快速过原创,收获更多的推荐。充分认知自己,发挥自己优势,选择合适主题和契合公众号风格进行投稿,不仅需要认清自己风格,更要找到擅长的领域进行写作,比如情感、时事热评、职场文学等;百家号广告收益计算公式为:“百家号广告收益=图文图集广告收益+视频广告收益+小视频广告收益”,换言之,只要文章阅读量高,广告分成也会随之水涨船高。_服务号的创作平台怎么选

Kivy 简明教程_on_release kivy-程序员宅基地

文章浏览阅读4.8k次,点赞4次,收藏39次。几个月不写中文了, 感觉还行。 So, let's begin our journey.首先,有两个网址你不得不看: Kivy: Cross-platform Python Framework for NUI 在官网逛逛,顺便看看最下面的代码,try to run it. https://www.youtube.com/playlist?list=PLQVvvaa0Qu..._on_release kivy

如何在Linux系统中编译安装python3.11.2_linux系统如何使用python csdn-程序员宅基地

文章浏览阅读1.6k次,点赞5次,收藏15次。在centos中,最新版的python软件是不能通过yum install命令的方式进行直接下载安装,但能通过其他方式进行编译安装,目前小编学习了一种常用的方式。此步是将python的安装路径放入PATH环境变量中,并永久修改,因为每次开机,机器都会运行/etc下的bashrc文件,所以追加输出至此文件。9、开启2个进程进行编译(可通过top命令进行查看自己机器的核数),因为python也是使用c语言开发的,需要编译成二进制程序。11、修改PATH变量,添加python的安装路径。4、进入解压后的目录。_linux系统如何使用python csdn

webpack4.0 相关插件集_webpack4.0可以使用插件吗-程序员宅基地

文章浏览阅读164次。let HtmlWebpackPlugin = require('html-webpack-plugin');//网页模板插件let MiniCssExtractPlugin = require('mini-css-extract-plugin');//样式打包插件let OptimizeCss = require('optimize-css-assets-webpack-plugin')..._webpack4.0可以使用插件吗

推荐文章

热门文章

相关标签