2.3 光栅化阶段

文章内容源自《GPU编程与CG语言之阳春白雪下里巴人》,因笔者读书易中途放弃,遂每读一章节,将其移至简书平台,以此作为对自己读书的勉励。笔者用粗体斜体 标注了关键词句,望感兴趣的读者们一起学习共勉。猛戳这里查看更多!

2.3 光栅化阶段

2.3.1 Rasterization

光栅化决定哪些像素被集合图元覆盖的过程(Rasterization is the process of determining the set of pixels covered by a geometric primitive)。经过上面诸多坐标转换之后,现在我们得到了每个点的屏幕坐标值(Screen coordinate),也知道我 们需要绘制的图元(点、线、面)。但此时还存在两个问题。

问题一:点的屏幕坐标值是浮点数,但像素都是由整数点来表示的,如果确定屏幕坐标值所对应的像素? 问题二:在屏幕上需要绘制的有点、线、面,如何根据两个已经确定位置的 2 个像素点绘制一条线段,如果根据已经确定了位置的 3 个像素点绘制一个三角形面片?

首先回答一下问题一, “绘制的位置只能接近两指定端点间的实际线段位置, 例如,一条线段的位置是(10.48,20.51),转换为像素位置则是(10,21)”(计算机图形学(第二版)52 页)。

对于问题二涉及到具体的画线算法,以及区域图元填充算法。通常的画线算法DDA 算法Bresenham 画线算法区域图元填充算法有,扫描线多边形填充算法边界填充算法 等,具体请参阅《计算机图形学(第二版)》第 3 章。

这个过程结束之后,顶点(vertex)以及绘制图元(线、面)已经对应到像素 (pixel)。下面阐述的是“如何处理像素,即:给像素赋予颜色值”。

2.3.2 Pixel Operation

Pixel operation 又称为 Raster Operation(在文献【2】中是使用 Raster Operation),是在更新帧缓存之前,执行后一系列针对每个片段的操作,其目的是:计算出每个像素的颜色值。在这个阶段,被遮挡面通过一个被称为深度测试的过程而消除,这其中包含了很多种计算颜色的方法以及技术。Pixel operation 包含哪些事情呢?

  • 1:消除遮挡面
  • 2:Texture operation,纹理操作,也就是根据像素的纹理坐标,查询对应的纹理值;
  • 3:Blending 混色根据目前已经画好的颜色,与正在计算的颜色的透明度(Alpha), 混合为两种颜色,作为新的颜色输出 。通常称之为 alpha 混合技术。 当在屏幕上绘制某个物体时,与每个像素都相关联的有一个 RGB 颜色值和一个 Z 缓冲器深度值,另外一个称为 alpha 值,可以根据需要生成并存储,用来描述给定像 处的物体透明度。如果 alpha 值为 1.0,则表示物体不透明;如果值为 0,表示 该物体是透明的, 从绘制管线得到一个 RGBA,使用 over 操作符将该值与原像素颜色值进行混合,公式如下:

a是透明度值(alpha), ca表示透明物体的颜色, cs表示混合前像素的颜色值, cd 是终计算得到的颜色值。Over 操作可以用于照片混合和物体合成绘制方面,这个过程称为合成(compositing)。可以联想一下,OGRE 中有一种技术称为 compositor(合成器)。 此外还需要提醒的一点是:为了在场景中绘制透明物体,通常需要对物体进行排序 。首先,绘制不透明的物体;然后,在不透明物体的上方,对透明物体按照由后到前的顺序进行混合处理。如果按照任意顺序进行混合,那么会产生严重的失真。既然需要排序,那么就需要用到 z buffer。关于透明度、合成的相关知识点,可以在《实时计算机图形学(第二版)》第四章 4.5 节(59 页)中得到更多详尽的知识。

  • 4:Filtering,将正在算的颜色经过某种 Filtering(滤波或者滤镜)后输出。 可以理解为:经过一种数学运算后变成新的颜色值。 该阶段之后,像素的颜色值被写入帧缓存中。图 5来自文献【2】1.2.3,说明了像素操作的流程:

图 5 OpenGL 和 Direct3D 中的 Raster Operations

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 未来布局之星——ConstraintLayout

    ConstraintLayout是Android Studio 2.2中具有亮点的新功能之一,相比于RelativeLayout、LinearLayout等传统...

    代码咖啡
  • 听说你使用Android Studio遇到了一些小困惑

    这个问题通常出现在Android Studio更新失败的时候,原因是download http://services.gradle.org/distributi...

    代码咖啡
  • 【9】全民博客时代的到来——20分钟简要教程

    很久以前就想搭建一个个人技术博客的网站了,但是那时候接触的东西不多,没有听说过hexo、jekyll、wordpress等快速blog生成工具,自己在网上找了博...

    代码咖啡
  • OpenCV实现0到9数字识别OCR

    使用OpenCV对0到9数字进行识别,实现简单OCR功能,基于CA(轮廓)分析实现特征提取,基于L1距离计算匹配实现数字识别。在排除干扰的基础上,识别精度可以达...

    OpenCV学堂
  • 未来布局之星——ConstraintLayout

    ConstraintLayout是Android Studio 2.2中具有亮点的新功能之一,相比于RelativeLayout、LinearLayout等传统...

    代码咖啡
  • 如何对1千万个整数进行快速排序

    输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7。如果在输入文件中有任何正数重复出现就是致命错误。没有其他数据与该正数相关联。

    编程珠玑
  • 【自然框架】之鼠标点功能现(一):单表的增删改查(即上次5月23日活动的一个主题)【Demo、源码下载】

    简单的需求,点点鼠标就可以了,那么复杂的需求呢?还是要写代码,哈哈。 不要被我误导了哦,关于什么时候写代码的问题,请看这里:http://www.cnblogs...

    用户1174620
  • 如何对 1 千万个整数进行快速排序

    输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7。如果在输入文件中有任何正数重复出现就是致命错误。没有其他数据与该正数相关联。

    五分钟学算法
  • 如何给一千万个整数快速排序

    输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7。如果在输入文件中有任何正数重复出现就是致命错误。没有其他数据与该正数相关联。

    编程珠玑
  • XGBoost 源码阅读笔记(2):树构造之 Exact Greedy Algorithm

    本篇将继续向大家介绍 XGBoost 源码是如何构造一颗回归树,不过在分析源码之前,还是有必要先和大家一起推导下 XGBoost 的目标函数。

    程飞翔

扫码关注云+社区

领取腾讯云代金券