光栅化

渲染管线研究:渲染管线示意图

一、 3D图形渲染(Rendering)

渲染:就是将三维物体或三维场景的描述转化为一幅二维图像,生成的二维图像能很好的反应三维物体或三维场景。过程:几何变换、光栅化、着色。

顶点渲染单元(Vertex Shader):根据描述3D图形外观的三角形顶点数据确定3D图形的形状及位置关系; 作几何变换、生成3D图像的骨架。

光栅化:显示的图像是由像素组成的,我们需要将描述3D图像骨架的一系列三角形通过一定的算法转换到相应屏幕上的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。

像素渲染(Pixel Shader):光照、光线追踪、纹理帖图、像素着色。 也就是对每个像素进行计算,从而确定每个像素的最终颜色。最后由ROP(光栅化引擎)完成像素的输出,1帧渲染完毕后,被送到显存帧缓冲区;然后经由D/A转换输出到显示器上。

三维渲染中的裁剪总汇

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

基本图形的光栅化算法

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

图形生成的概念

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

直线段的扫描转换

直线的绘制要求

(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的基本知识,包括场景生成和光线处理。在本文中,我们将展示如何有效地使用这些光线来呈现不同的效果,并将其结果与光栅化进行对比。

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

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

直线的光栅化算法

给定起点( x1 , y1 )和终点( x2 , y2 ),直线的光栅化算法要找出哪些像素应该被着色。简单起见,这里假设 x1 < x2

一、直观的方法

当直线的斜率 | k | = | ( y2 - y1 ) /( x2 - x1 ) | < 1 时,直线在 y 向的变化速率小于在 x 方向上的变化速率,因此可以遍历 x1 到 x2 间的每一个 x ,计算对应的 y 值并将其四舍五入画点。算法伪代码如下:

k = ( y2 - y1 ) / ( x2 - x1 )
y =  y1
for x = x1 to x2
    draw_point ( x, round ( y ) )
    y += k

渲染流程——光栅化阶段

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

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

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

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

三角形遍历
检查每个像素是否被一个三角形网格所覆盖。如果被覆盖就会生成一个片元(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描写叙述。

光栅化发生在哪一步?

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