首页 > 其他分享 >光栅化

光栅化

时间:2024-03-05 22:46:56浏览次数:13  
标签:std 采样 卷积 频域 像素 信号 光栅

光栅化 Rasterize

将经过观测变换后在\([-1*-1*-1]\)立方体的物体绘制在屏幕上
Rasterize == Drawing onto the screen

屏幕

一个二维数组,每个元素表示一个像素(pixel)
初步认知:一个pixel内部颜色不会变化
像素的范围在(0,0) 到 (width-1,height-1)
一个像素的中心是(x+0.5,y+0.5)

变换 3D立方体到2D屏幕

z值用于zbuffer
目前只考虑x,y方向的拉伸

拉伸原本为2的高度,变为 width或者height
将原本在中心的原点移动到左下角

可以得到视口变换矩阵\(M_{viewport}\)

\[M_{viewport} = \begin{bmatrix} \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{bmatrix} \]

物体到屏幕的变换

MVP矩阵变换矩阵 -> 视口变换矩阵
image

像素化

将组成物体的多个多边形(目前以三角形为例)用屏幕上的像素来表示

一个像素与一个三角形的关系

即观测像素的中心点是否在三角形内

绘制方法:离散化

离散化:将连续的变换值,变为离散的间距相等的点

for(int x = start ; x < end ; x++) //x++就是离散过程
{
  for(int y = start; y< end ; y++)
  {
    //pixel(x,y) 是否在三角形内部
    if(inside(x,y,tri))
      //着色
      color[x][y] = f(x,y);
  }
}

判断一个像素中心点是否在三角形内

一个三角形P1P2P0,像素中心点Q

static bool insideTriangle(float x, float y, const Vector3f* _v)
{
    // TODO : Implement this function to check if the point (x, y) is inside the triangle represented by _v[0], _v[1], _v[2]
    Vector3f a (_v[1].x()-_v[0].x(),_v[2].x()-_v[0].x(),_v[0].x()-x);
    Vector3f b (_v[1].y()-_v[0].y(),_v[2].y()-_v[0].y(),_v[0].y()-y);
    //叉乘
    Vector3f c (a.y()*b.z()-a.z()*b.y(),a.z()*b.x()-a.x()*b.z(),a.x()*b.y()-a.y()*b.x());
    if(abs(c.z()) < 1e-2) return false;
    //点(x,y)的重心坐标
    Vector3f res (1.f-(c.x()+c.y())/c.z(),c.y()/c.z(),c.x()/c.z());
    if(res.x() < 0 || res.y() < 0 || res.z() < 0) return false;
    return true;
}

包围盒 -- 约束可以光栅化的范围

包围整个待光栅化物体的范围,可以避免对不在这个区域的像素进行光栅化操作

//vector<tria> v(3) 表示三角形的三个顶点
int minx, maxx, miny, maxy;
minx = std::min(v[0].x(), std::min(v[1].x(), v[2].x()));
maxx = std::max(v[0].x(), std::max(v[1].x(), v[2].x()));
miny = std::min(v[0].y(), std::min(v[1].y(), v[2].y()));
maxy = std::max(v[0].y(), std::max(v[1].y(), v[2].y()));

反走样

解决边缘锯齿效果
原始信号变化的太快,采样频率小于变化频率,导致走样现象的出现

滤波 -- 模糊

傅里叶变换 -- 时域到频域
一般图片经过傅里叶变换后,中间低频信息较多(亮),四周的高频信息较少(暗)
图像在频域中的高频信号一般可以表示出图像内容的边界(高通滤波:取出低频信号)
图像在频域中的低频信号一般会将图像模糊 (低通滤波:去掉高频信号)

滤波的效果 == 卷积的效果 == 平均的效果

  1. 时域的卷积 == 频域的乘积
  2. 时域的乘积 == 频域的卷积

为了能达到图像模糊的效果,可以采用这样的方法,对一个图片上的像素点,可以将其周围的3×3的像素值的平均值写入当这个像素点到达了模糊效果。

走样的原因 -- 频率上的解释

在时域上,采样频率小,说明采样间隔大。而采样结果相当于时域上原始信号和采样信号的乘积,对应频域上就是原始信号频率和采样频率的卷积。
当时域上采样间隔大,那么频域上的间隔就会减小,导致每个采样信号下的原始信号频谱出现重叠的现象导致走样
重叠部分的一般为高频信息
image
image

解决走样的方法

  1. 增加采样率 -- 分辨率
  2. 对原始信号先模糊再采样

模糊

模糊 == 低通滤波 == 移除一个信号的高频信息 == 去除频域中重叠区域
使用一定大小的块,对当前图像信号进行卷积操作。
最直观的块就是一个像素大小的块,将这个块作为卷积盒,对图像(以三角形为例)进行卷积。
如果以一个像素大小的块作为box filter,那么这个像素块的颜色就是三角形覆盖住的部分和未覆盖部分的平均值。

MSAA

对原始的每个像素再划分比如2×2,然后对这4个格子判断每个格子的中心点是否在三角形内,然后着色,这样就可以算出一个像素的平均颜色。
image

标签:std,采样,卷积,频域,像素,信号,光栅
From: https://www.cnblogs.com/XTG111/p/18055408

相关文章

  • GAMES101 Rasterization 光栅化
    向量点乘的作用计算两个方法方向夹角计算两个方向是否接近关于两个方向的计算向量叉乘\[\vec{a}\times\vec{b}=\begin{pmatrix}y_az_b-y_bz_a\\z_ax_b-x_az_b\\x_ay_b-y_ax_b\end{pmatrix}\]\[\veca\times\vecb=A^*b=\begin{pmatrix}0&-z_a&y_a\\z_a&0&-x_a\\-y_a&x......
  • Unity3D DrawCall和openGL、光栅化等有何内在联系详解
    前言Unity3D是一款跨平台的游戏引擎,广泛应用于游戏开发领域。在Unity3D中,DrawCall是一个重要的概念,它与OpenGL、光栅化等技术有着密切的内在联系。本文将详细解释DrawCall的概念,并给出相关技术的详细解释和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交......
  • Unity3D DrawCall和openGL、光栅化等有何内在联系详解
    Unity3D是一款跨平台的游戏引擎,广泛应用于游戏开发领域。在Unity3D中,DrawCall是一个重要的概念,它与OpenGL、光栅化等技术有着密切的内在联系。本文将详细解释DrawCall的概念,并给出相关技术的详细解释和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础......
  • 计算机图形:图元、片元、光栅化等基本概念
    几种“点”的概念顶点(vertex):图元(如线段、三角形、圆等几何图形)由顶点+边组成,由用户及其建立的模型确定.图元(primitive):描述对象的几何要素的输出图元,称为几何图元,简称图元.如点、直线段、圆、二次曲线、曲面等.片元(fragment):光栅化过程的产物,光栅化将一个图元转变成二维图......
  • 光栅打印控制命令(单页)
    ArrayList<Byte>page=newArrayList<>();//下行指令包含打印机初始化,复位,指定打印分辨率为300dpipage.addAll(hexToByteArray("1B252D31323334355840504A4C20434F4D4D454E54202A5374617274204A6F622A200D0A40504A4C204A4F42204E414D4520......
  • 【图形学笔记】Lecture02&03 光栅化、抗锯齿、Z-buffer
    目录Lecture02-DigitalDrawing数码绘画Triangles-FundamentalAreaPrimitive三角形——基本区域Rasterization光栅化Sampling采样Lecture03-Sampling,Aliasing,Antialiasing采样、锯齿、抗锯齿Artifactsduetosampling-“Aliasing”采样产生的问题-混叠Antialias......
  • 开源游戏 | 一款采用 Java开发的基于小孔成像原理与图形光栅化的字符 3D 画面框架构建
     去关注、不迷路一、项目概述       这是一款采用JavaSwing开发的基于小孔成像原理与图形光栅化的字符3D画面框架构建的空战游戏,简单说就是作者为了做个3D字符空战游戏,顺手写了个3D引擎,别人的本科毕设。注:dogfight为军事用语,是指战机近距离接战缠斗,可直接......
  • 光栅化与纹理贴图
    光栅化:投影到屏幕上的物体将它划分为一个一个三角形,通过纵线和横线分割成pixel。主要确定这些三角形应当由哪些像素组成在这个过程中,会出现走样问题。物体->三角形->pixel纹理贴图:主要确定漫反射系数纹理贴图:通过光栅化后,物体变为各个三角形,三角形有被分为Pixel,纹理贴图的操作......
  • 基于位相光栅的四波横向剪切干涉法波前检测算法的matlab仿真
    1.算法理论概述      波前检测技术是现代光学中的重要技术之一,可以用于衡量光学系统的成像质量和研究光学系统的异常现象。随着现代光学技术的不断发展,波前检测技术也在不断地发展和完善。其中,基于位相光栅的四波横向剪切干涉法波前检测算法是一种常用的波前检测算法,本文......
  • 4.Rasterization光栅化(反走样,深度缓存)
    走样Aliasing(锯齿)采样的广泛应用采样不仅可以在图片的某个位置,也可以在时间轴上动画就是一组图在时间的采样Artifacts(瑕疵、错误)采样会产生一些Artifacts(瑕疵、错误)例如:锯齿(图像上的采样)摩尔纹(删除图像奇数行,再放大成原大小后可得)”车轮效应“(车轮旋转速度过快,......