Pixel World

it's better be burning out than to fade away.

Computer-Graphic08-空间数据结构

本篇文章我们讨论当场景复杂度大幅增加时,如何进行高效的几何查询。现实世界中的真实场景极其复杂,那么从计算的角度我们如何处理这些复杂的场景呢?其中很重要的一个用例就是光线追踪:用于光线和场景求交。

0.png

光线三角形求交

声明一个三角形,三个顶点分别是$p_0,p_1,p_2$, 定义一条光线,从$o$出发,沿着$d$方向行进,光线的参数化方程可以定义如下:

$\mathbf{r}(t) = \mathbf{o} + t\mathbf{d}$

这里需要解决两个问题,第一个光线是否与三角形相交,第二个如果相交那么交点在哪里?

1.png

首先将光线的参数化方程代入平面的隐式方程可得:

阅读全文 »

颜色

颜色是什么

光线就是震荡的电磁场, 颜色就是频率

01.png

电磁场震荡的频率决定了光线的颜色.

那么光线的波长和频率之间有什么关系呢?

波长和频率其实本质上表征的是一件事情, 但是使用了不同的方式来表达而已.

$wavelength = 1 / frequency$

$frequency = 1 / wavelength$

阅读全文 »

从零实现软渲染(三):Rasterize/绘制三角形

在上一篇文章《窗口系统/viewport》中,通过SDL库我们搭建了一个简易的窗口系统,并通过SDL内置API在屏幕中心绘制了一个矩形来测试RenderLoop。
本章我们将实现自己的渲染器,用它绘制一个三角形。但在开始前,让我们先回顾下渲染的核心概念。

渲染器有两个核心任务:解决可见性着色。解决可见性通常有两种方式:光栅化光追。这两种常用的算法用于解决渲染中的可见性问题, 即找到哪些物体在相机下的视口是可见的.

阅读全文 »

后续文章发布计划

在正式开始本章内容之前,我对专栏后续的更新计划/大纲做了详细梳理,大家可以对整体框架结构及涉及到的知识点有个初步的认识。

在后续的文章更新过程中会基本按照上图框架的内容和顺序逐步展开深入,每一个大的分类代表了渲染系统中的一个组件,正常情况下会做为一篇单独的文章出现,内容过多会拆分为上下两篇(PBR…),另外相对较难或者比较重要的知识点会单独拉出来做为一个专项,预计总共会更新25篇文章左右,从易到难,由浅入深实现整个渲染系统。本系列不涉及图形API,但是shader抽象类会模仿GLSL语言规范的写法和命名方式,使大家有更强的代入感。那么废话不多说,接下来我们正式开始本篇文章的第一个主题:窗口系统的构建。

阅读全文 »

何为软渲染,为什么要学习它

本系列文章将会从零手实现一个mini软渲染器(光栅化), 何谓软渲染? 我们为什么需要学习它? 我们知道复杂的图形渲染一般都是由GPU来处理的,所谓软渲染就是用CPU来模拟GPU的行为,在CPU端完全实现图形的绘制, 这其中包含一系列复杂微妙的过程,但整体上可以将其划分为两个大的模块: 可见性和着色,这其中又包含若干细节:

可见性:

  • 模型变换
  • 视图变换
  • 投影变换
  • 透视除法
  • 视口变换
  • 计算三角形包围盒
  • 三角形光栅化
  • 重心坐标插值
  • 视图变换
  • 深度缓冲
  • 相机模型构建

可见性解决的问题是,对于屏幕上的任意一个像素,场景模型中的哪个片元对它是可见的. 主要通过以下几个步骤完成:

阅读全文 »

截止到目前我们学习了如何将物体拜访到世界空间,如何将三维空间物体投影到二维屏幕上,以及对三角形光栅化,判断哪些像素被三角形所覆盖,接着基于重心坐标对三角形三个顶点插值得到采样点属性,拿到采样点片元的$uv$后可以对纹理采样, 这个过程涉及纹理过滤(双线性插值,最临近采样...)及$Mipmap$等,最后通过深度及透明度将这些片元混合输出到帧缓冲($FrameBuffer$)

阅读全文 »

顶点插值属性不仅仅是颜色值,而是某种可以进行纹理映射的纹理坐标,那么什么是纹理映射?纹理映射一个很好的类比就是包装一份礼物,我有一些彩纸,上面绘制了一些有趣的图案,还有一个平平无奇的立方体,只是一个扁平的盒子,我想把这个有趣的图案放在盒子上,该怎么做呢?把纸包裹在盒子上就行了,这本质上就是纹理映射,将二维图像包裹在三维表面上的方法。

阅读全文 »

本章将开始学习空间变换,空间变换在图形学中有非常广泛的应用,对于深入了解图形学底层有重要意义,特别在光栅化渲染管线中, 我们知道最初输入的顶点坐标都是在对象局部空间的($Local Space$), 需要经过一系列的变换将对象从局部空间变换到世界空间(物体摆放在场景的哪里,物体的相对位置关系),接下来再变换到相机空间(即我们观看的视角,就像拿个相机拍照一样,我们是从哪个角度对场景进行观察的),即$mvp$矩阵中的"$m(model Matrix)$和$v(view Matrix)$".这一系列操作即光栅化渲染管线的第一个阶段,也是理解光栅化背后原理的基础.本章将介绍涉及图形学的基础变换。

阅读全文 »
0%