Graphics and Rendering Introduction

原文:http://www.arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.html

翻译得比较粗糙,以后有时间再修改了


图形与绘制

这一部分是绘制过程的概述。如果你不能马上明白所有的东西,请不要担心,在后面的教程中,会有大量的细节去介绍这里的每一步骤。

 

你在计算机屏幕上看到的一切,即使是你正在阅读的这个文本(假设你在电子显示设备上阅读这个教程,而不是把它打印出来)仅仅是一个二维的像素阵列。如果你把在屏幕上某部分进行截图,并放大它,它将会看起来像方块状。


 

这些方块中的每一个叫做像素,单词“像素”是由术语“图像元素”演化而来。在你屏幕上的每一像素都有特定的颜色。像素的二维阵列被称为图像

 

因此,任何一种类型图形的目的是为了确定哪些颜色将存入到哪些像素。这个确定使文本看起来像文本,窗口看起来像窗口,等等。

 

由于所有的图形只是像素的二维阵列, 那么3D的图形怎样运作呢? 3D图形是一个为像素产生颜色的系统, 这个系统使你觉得你正在看到的是3D的世界,而不是2D的图像。这个把3D世界转换成2D图像的过程称为绘制(rendering)。

 

有几种方法可以绘制一个3D的世界。 这个过程使用实时图形硬件,such as that found in your computer, involves a very great deal offakery这个过程被称为光栅化,而使用光栅化的绘制系统被称为光栅器


在光栅器中,你所看到的所有对象都是empty shell。有一些技术可以让你用来打开这些empty shell,但这样简单的用另外的shell去替换原来的shell一部分,显示了其内部的模样。 一切都是一个shell。


所有这些shells是由三角形组成的。 即使是那些看起来是圆的表面,如果你足够靠近去观察的话,它们也仅仅是一些三角形。有些技术对象可以随着显示越近或越大,产生越多的三角形,因此观察者几乎不能够看到对象的面轮廓。但它们总是由三角形组成的。

注:

一些光栅器使用平面四边形:四条边的物体,所有的点位于同一平面上。基于硬件的光栅器总是使用三角形的一个原因是:所有三角形的线保证是在同一平面上的。了解这一点使得我们能更容易去理解光栅处理的过程。

 

一个物体所组成的相邻三角形确定了物体的外表面。 这样的一系列三角形通常被称为几何模型网格(mesh)。这些术语可以互换使用。

 

光栅化的过程有几个阶段。 这些阶段被排序进一条管线,在这其中三角形从顶部进入而2D图像在底部填充。这就是为何光栅扫描如此适合于硬件加速的原因之一:它每一次作用于每一个三角形,按照特定的顺序。Triangles can be fed into the top of the pipeline while trianglesthat were sent earlier can still be in some phase of rasterization.

 

三角形和各个网格提交到光栅器的顺序,可以影响它的输出。 永远要记住的是,无论你是如何提交三角形的网格数据,光栅器会把每一个三角形处理成一个特定的顺序,后一个三角形只有在前一个三角形完成绘制后才开始绘制。  

 

OpenGL是用于访问基于硬件的光栅器的API。 正因为如此,它适合基于光栅化的3D模型绘制。光栅器从用户接收一系列的三角形,对它们执行操作,并基于三角形的数据写到像素。这是在OpenGL中光栅化怎么工作的简化,但这对我们达成目的是有效。


三角形和顶点。三角形由3个顶点组成。顶点是任意的数据的集合。为简单起见(我们将在以后进行扩展),让我们假设这个数据必须包含三维空间中的一个点。它可以包含其它数据,但至少需要有这个点数据。不在同一直线上的任意3个点创建出一个三角形,所以三角形最小的信息项包含三个三维的点。

在三维空间中的一个点是由3个数字或坐标来定义。 X坐标,Y坐标和Z坐标。 这些通常被写在括号里面,如(X,Y,Z)。


光栅化概述

光栅化pipeline,特别是对现代的硬件而言是非常复杂的。下面是对这个pipeline的一个非常简单的概述。在我们去探讨怎么使用OpenGL去绘制东西的细节之前,有必先对这个pipeline有简单的理解。如果没有一个高角度的预览,那些细节会让你觉得崩溃。


裁剪空间的变换。

光栅化的第一阶段是将每个三角形的顶点转换到空间的某个区域。此这个区域内的一切将被绘制到输出的图像,而任何在这个区域之外的部分都不会显示。这个区域对应于用户想要绘制的世界的视图。


三角被转换的这个空间,在OpenGL中是被称为:裁剪空间。在裁剪空间中,三角形顶点的位置被称为裁剪坐标


裁剪坐标与常规的位置有一些不同。 在三维空间中的一个位置有3个坐标。在裁剪空间中的一个位置则有四个坐标。前三个坐标一般是X,Y,Z位置; 第四个坐标叫W。这最后的坐标实际上定义了对于这个顶点的裁剪空间范围。


裁剪空间随着一个三角形中不同的顶点而不同。它是在每个X,Y和Z方向上介于[-W,W]范围的三维空间区域。因此具有不同w坐标值的顶点是跟其他顶点在不同的裁剪空间立方体。 由于每个顶点都可以有一个独立的w成分,三角形的每个顶点存在于它自己的裁剪空间里。


在裁剪空间中,X正方向是向右,Y轴正方向是向上,而Z轴正方向是远离观察者。


把顶点位置转换到裁剪空间的过程是很随意的。 OpenGL在这个步骤上提供了很大的灵活性。我们在整个教程中将详细介绍这个步骤。


因为裁剪空间是世界的可见转换版本,任何在这个区域之外的三角形将被丢弃。任何有部分在这一区域之外的三角形,会经过一个称为裁剪的步骤。这一步骤把三角形分割成许多较小的三角形,这些较小的三角形完全在裁剪空间之内。 因此将这个空间命名为“裁剪空间”。


规范化的坐标。裁剪空间很有趣,但不方便。对于每个顶点这个空间的范围是不同的,这使三角形的可视化变得较为困难。 因此,裁剪空间转化为一个更合理的坐标空间:规范化设备坐标


这个过程是很简单的。各顶点的位置的X,Y和Z值除于W,得到规范化的设备坐标。这就坐标变换的全部。


规范化设备坐标空间在实质上也是裁剪空间,所不同的是,它的X,Y和Z值的范围是[-1,1]。 而方向都是相同的。 以W来划分是3D三角形投影到二维图像的重要组成部分; 我们将在今后的教学进行介绍。


 


立方体表示规范化设备坐标空间的边界。

 

窗口转换。光栅化的下一阶段是再次改变每个三角形的顶点。这一次,他们是从规范化设备坐标转换到窗口坐标。正如名字所示,窗口坐标是相对于OpenGL运行的窗口。

 

即使它们涉及到窗口,但它们仍然是三维的坐标。 X正方向向右,Y向上,Z则远离,就像裁剪空间一样。 唯一的区别在于,这些坐标的边界取决于可视窗口。在窗口坐标中还值得注意的是,没有精度的损失。它们不是整数值得坐标; 他们仍然是浮点值,因此它们的精度超过单个像素。

 

Z的边界是[0, 1],0是最接近的,而1为最远。在此范围以外的顶点位置是不可见的。

注意,窗口坐标把左下位置(0,0)作为原点。 这是违背了用户用于在窗口坐标系,它是具有左上角的位置为原点。这个过程的全部细节将会在整个教程中进行讨论。There are transform tricks you can play to allow you to work in atop-left coordinate space if you need to.

 

扫描转换。在把三角形的坐标转换到窗口坐标系后,将三角形经历的过程称为扫描转换,This process takes the triangle and breaks it up based on thearrangement of window pixels over the output image that the triangle covers.




中间的图像展示了输出像素的数字化网格; 圆形表示每个像素的中心。每个像素的中心,代表了一个sample:一个像素区域内的离散位置。经过扫描转化,对三角形的二维区域内的每个像素样本,会生成一个fragment。

 

右边的图像展示了三角形经过扫描转换所产生的fragment。这生成了三角形的大致近似形状。

 

绘制三角形共享边的情况是非常常见的。 OpenGL保证的是,只要共享边的顶点位置是相同的 ,在扫描转化时就不会有sample间的间隙。



 

为了更方便的使用这种共享边,OpenGL也提供了保证,只要你传递相同的输入顶点数据到相同的顶点处理器,你将会得到相同的输出;这就是所谓的不变性保证。为了保证gaps-less的扫描转换,用户有义务去使用相同的输入顶点。

 

扫描转换本质上是一种2D的操作。 此过程仅使用窗口坐标中的三角形X和Y位置,以此确定​​哪些fragment要生成。 Z值不会被遗弃,但它不直接是扫描转换三角形的实际过程中的一部分。

 

扫描转换三角形的结果是覆盖该三角形形状的fragment序列。每个fragement具有与它有相关的某些数据。这些数据包含了fragment在窗口坐标中的二维位置,以及fragment的Z位置。此Z值被称为fragment的深度值。 fragment有可能还有其它相关信息,我们将在以后的教程上的进行扩展。

 

Fragment处理,这个阶段需要把扫描转换三角形生成的片段转换为一个或多个颜色值,和一个单一的深度值。从一个三角形片段处理的顺序是无关紧要的; 因为一个三角形位于一个单独的平面上,从三角形产生的片段不可能重叠。然而,从另一个三​​角形产生的片段就有可能重叠。由于操作顺序对于光栅器是重要的,从一个三角形生成的片段都必须在其它三​​角形生成的片段之前进行处理。

 

这个阶段是很随意的。 OpenGL的用户有很多种选择,去决定为片段赋予什么样的颜色。我们将在整个教程详细介绍这个过程。

 

Direct3D的注意事项


Direct3D的更喜欢称这个阶段称为“像素处理”或“像素着色”。这种用词不当有以下几个原因。首先,像素的最终颜色可以由在单个像素由多个样本生成多个片段的结果。 这是一种常见的技术来去除三角形的锯齿边缘。 此外,该片段的内容还没有被写入到图像,所以它不是一个像素的爱好。事实上,片段处理步骤可以有条件地防止基于任意计算片段的呈现。 因此,在D3D的说法是“像素”可能永远不会真正成为一个像素都没有。

 

片段写操作。在产生一种或多种颜色和深度值后,该片段被写入到目标图像。这一步涉及到的不仅仅是简单的写到目标图像。 组合的颜色和深度与当前图像中的颜色可以涉及若干计算的。Combiningthe color and depth with the colors that are currently in the image can involvea number of computations.这些将在以后许多教程中详细介绍。

 

颜色

 

此前,像素被说成是在一个2D图像中具有特定颜色的元素。一种彩色可以用很多种方式进行说明。

 

在计算机图形中,颜色通常被描述为在[0,1]范围内的一系列数字。每个数字对应于特定基准色的强度; 因此,由一系列数字表示的最终颜色是这些基准颜色的混合。

 

该组基准颜色被称为色彩。屏幕中最常用的颜色空间是RGB,其中所述基准色彩是红色,绿色和蓝色。印刷作品则倾向于使用CMYK(青色,品红色,黄色,黑色)。因为我们是要处理屏幕上的绘制,而且加上OpenGL的要求,所以我们将使用RGB颜色空间。

 

通过编程着色器,你可以玩一些fancy的游戏(见下文),它这你可以在不同的色彩空间工作。因此从技术角度上讲,我们只需要输出到一个线性的RGB色彩空间。

 

因此,在OpenGL中像素被定义为范围在[0,1]的三个值,这些值表示在一个线性RGB色彩空间中的颜色。通过混合这3种颜色不同的强度,我们可以产生数百万不同深浅的颜色。这里还有一些小扩展,我们将在以后讨论去透明度。

 

着色器

 

着色器被设计为一个在渲染器上工作程序,这个程序是渲染操作中的一部分。无论我们使用哪种渲染系统,着色器只能在渲染中某一确定的点上执行。这些着色器阶段represent hooks,在其中用户可以添加任意的算法来创建一个特定的视觉效果。

 

正如上文所述,光栅化过程中有几种着色器阶段,其中任意处理是既经济性能,并提供高实用程序的用户。例如,顶点进入到裁剪空间的变换是用户进行自定义代码的useful hook,​​as is the processing of afragment into final colors and depth.

 

对OpenGL来说,着色器实际上是在渲染硬件上运行的。 这往往可以腾出宝贵的CPU时间执行其它任务。如果没有这种执行任意代码的灵活性,执行简单的操作都会变得困难。A downside of this is that they must live within certain limits thatCPU code would not have to.


有许多着色语言提供各种的APIs。 在本教程中主要使用的是OpenGL的着色语言。这就是所谓的OpenGL着色语言(GLSL),是不是很俗?它看起来好像C语言,但它实际上却非常不像 C。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值