光栅化

三维渲染中的裁剪总汇

裁剪是个很大的概念,裁剪包括了视锥体裁剪(应用程序阶段)、视口裁剪(图元装配——几何阶段的最后一步)、背面剔除(光栅化阶段)、遮挡剔除(光栅化阶段)。

基本图形的光栅化算法

如何在指定的输出设备上根据坐标描述构造基本二维几何图形(点、直线、圆、椭圆、多边形域、字符串及其相关属性等)。

图形生成的概念

图形的生成:是在指定的输出设备上,根据坐标描述构造二维几何图形。
图形的扫描转换:在光栅显示器等数字设备上确定一个最佳逼近于图形的象素集的过程。

直线段的扫描转换

直线的绘制要求

(1)直线要直;
(2)直线的端点要准确,无定向性无断裂;
(3)直线的亮度、色泽要均匀;
(4)画线的速度要快;
(5)具有不同的色泽、亮度、线型等。
解决的问题:给定直线两端点P0(x0,y0)和P1(x1,y1),画出该直线。

逐点比较法:

数值微分法(DDA法):
增量算法
直观、易实现
不利于用硬件实现
x(i+1) = x(i) + 1
y(i+1) = y(i) + k

中点Bresenhan算法:

光栅化三维场景的基本流程

数学上的规定:

由于习惯的不同,每个人对同一个事物的标准也不同。

应事先规定好整个项目的一些“习惯”,并坚决贯彻它们,上下统一。

世界坐标系:

场景中所有物体处于世界坐标系下,且所有的坐标系均为左手坐标系,左手坐标系三个轴的指向如图:

光栅化三维场景的基本流程

以屏幕为基准,该坐标系X轴指向右,Y轴指向上,Z轴指向屏幕里面。

以此坐标系我们可以创建一个世界空间。当然并没有真正创建出来,只是一个约定,便于日后的使用。就像地球的经纬度一样,有了这个我们就能描述什么东西在什么地方了。

物体坐标系:

而世界中有很多物体,比如游戏中的模型,玩家等等。

该世界里的每个物体都含有三个数据:

1)该物体中心处于世界的位置(x,y,z)

实时渲染中常用的几种 Rendering Path

[导读] Rendering Path 其实指的就是渲染场景中光照的方式。由于场景中的光源可能很多,甚至是动态的光源。所以怎么在速度和效果上达到一个最好的结果确实很困难。以当今的显卡发展为契机,人们才衍生出了这么多的 Rendering Path 来处理各种光照。

1. rendering path 的技术基础

在介绍各种光照渲染方式之前,首先必须介绍一下现代的图形渲染管线。这是下面提到的几种 Rendering Path 的技术基础。

实时渲染中常用的几种 Rendering Path

实时光线的混合渲染:光线追踪VS光栅化

上一篇文章中,我们阐述了PowerVR光线追踪API的基本知识,包括场景生成和光线处理。在本文中,我们将展示如何有效地使用这些光线来呈现不同的效果,并将其结果与光栅化进行对比。

以下视频即光线工厂——我们最新的混合渲染演示:

混合光线追踪可以更好地进行渲染

渲染流程——光栅化阶段

渲染流程分为三个阶段:应用阶段,几何阶段,光栅化阶段。

光栅化阶段:使用上个阶段传递来的数据产生屏幕上的像素,并渲染出最终的图像。

光栅化的任务主要是决定每个渲染图元中的哪些像素应该被绘制在屏幕上。需要对上一个阶段得到的逐顶点数据(例如纹理坐标、顶点坐标等)进行差值。然后再进行逐像素处理。

三角形设置
计算光栅化一个三角形网格所需要的信息。
为了能够计算边界像素的坐标信息,我们需要得到三角形边界的表达方式。这样一个计算三角形网格表示数据的过程就叫做三角形设置。

三角形遍历
检查每个像素是否被一个三角形网格所覆盖。如果被覆盖就会生成一个片元(fragment)。找到哪些像素被三角网格覆盖的过程就是三角形遍历。也称为扫描变换。
三角形遍历阶段还会使用三角网格的3个顶点信息对整个覆盖区域的像素进行差值。
输出:片元。
片元并不是真正意义上的像素。而是包含了很多状态的集合,这些状态用来计算最终颜色。这些状态包括但不限于它的屏幕坐标,深度信息,法线,纹理坐标等。

片元着色器:
输入:对于从顶点着色器输出的数据插值得到的。
输出:一个或者多个颜色。
工作:纹理采样

逐片元操作
高度可配置
主要任务:

如何理解OpenGL 中着色器、渲染管线、光栅化等概念?

在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。

图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。

注:2D坐标和像素也是不同的,2D坐标精确表示一个点在2D空间中的位置,而2D像素是这个点的近似值,2D像素受到你的屏幕/窗口分辨率的限制。

图形渲染管线接受一组3D坐标,然后把它们转变为你屏幕上的有色2D像素输出。图形渲染管线可以被划分为几个阶段,每个阶段将会把前一个阶段的输出作为输入。所有这些阶段都是高度专门化的(它们都有一个特定的函数),并且很容易并行执行。正是由于它们具有并行执行的特性,当今大多数显卡都有成千上万的小处理核心,它们在GPU上为每一个(渲染管线)阶段运行各自的小程序,从而在图形渲染管线中快速处理你的数据。这些小程序叫做着色器(Shader)。

为什么要光栅化?光栅化插值方法

光栅化是在计算机上生成图像的重要步骤,然而无论是opengl还是directx还是其他的图形接口都封装了光栅化方法。我自己做了个光栅器,接下来就说一下怎样实现光栅化的。

为什么要光栅化?

图形管线的输入是图元顶点,输出的则是像素(pixel),这个步骤其中还有个中间产物叫做片段(fragment),一个片段相应一个像素,但片段比像素多了用于计算的属性,比如:深度值和法向量。通过片段能够计算出终于将要生成像素的颜色值,我们把输入顶点计算片段的过程叫作光栅化。为什么要光栅化?由于要生成用以计算终于颜色的片段。

光栅化的输入和输出各自是啥?
和普通函数一样,光栅化函数也须要输入和输出,从之前的定义来看函数的输入就是组成图元的顶点结构,输出的就是片段结构,为什么说是结构?由于这些能够用c语言中的struct描写叙述。

光栅化发生在哪一步?

光栅的类型和结构

光栅是由很多等节距的透光缝隙和不透光的刻线均匀相间排列构成的光电器件。按照工作原理,光栅可分为物理光栅和计量光栅,物理光栅基于光栅的衍射现象,常用于光谱分析和光波长等测量;计量光栅是利用光栅的莫尔条纹现象进行测量的器件,常用于位移的精密测量。

按用途和结构形式,计量光栅又可分为测量线位移的长光栅和测量角位移的圆光栅。实际应用时,计量光栅又有透射光栅和反射光栅之分,透射光栅是在透明光学玻璃上均匀刻制出平行等间距的条纹形成的,而反射光栅则是在不透光的金属载体上刻制出等间距的条纹所形成。本节主要讨论透射式计量光栅。

透射光栅的结构如图12.1.1所示,a为刻线(不透光)宽度,b为缝隙(透光)宽度, W = a+b称为光栅的栅距,一般a=b,也可做成a:b=1.1:0.9。常用的透射光栅的刻线密度一般为每毫米10、25、50、100、250条线,刻线的密度由测量精度决定。

光栅的类型和结构

OpenGL工作流程

在OpenGL中,一切事物都在3D空间中,但我们的屏幕坐标确实2D像素数组,OpenGL大部分工作就是把3D坐标转换成适应屏幕的2D像素。3D坐标转换成2D屏幕坐标的过程是有OpenGL的图形渲染管线管理的。图形渲染管线的工作可以被划分为两个主要的部分:

一、把3D坐标转换成2D坐标。

二、把2D坐标转换成实际有颜色的像素。

注意:2D坐标和像素是不同的,2D坐标精确的描述了一个点在2D空间中的位置,二2D像素是这个点的近似值,2D像素收到你的屏幕/窗口分辨率的限制

OpenGL工作流程

图形渲染管线包含很多部分。首先,我们以数组形式传递3D个3D坐标作为图形渲染管线的输入,用来表示三角形,这个数组叫做定点数据(Vertex Data);定点数据是一系列定点的集合。一个顶点(Vertex)是一个3D坐标的集合。为了简单起见,我们假定每个顶点只由一个3D位置和一些颜色值构成。

同步内容
--电子创新网--
粤ICP备12070055号