原始的组装、剪裁和光栅化

  

周一到周五,每天一篇,北京时间早上7点准时更新~,中英文对照,一边学编程一边弹吉他,做一个奇葩码农!

  

前端后管道运行(包括顶点着色、镶嵌和几何阴影)(当前面提到的那些渲染管线阶段执行完毕后),一个固定功能流水线执行一系列的任务的一部分,带的顶点表示我们的场景,将它转换成一系列的像素(渲染管线固定管线的部分会通过一系列手段将那些空间中的点变成像素),这反过来需要彩色和书面到屏幕上(这些像素随后将被着色并刷新到屏幕上去)。这个过程的第一步是原始的大会第一步是生成图元像素),这是顶点的分组线和三角形(也就是要把点们变成个线和三角形)。原始组装仍然发生点,但这是微不足道的在这种情况下(生成图元像素的步骤也可以生成点的像素,但是生成点不是很重要)

  

一旦原语由个人的顶点,他们剪可显示的区域,这通常意味着窗口或屏幕,但也可以是一个较小的区域被称为视窗(当从一些独立的点去构建图元的时候,他们将会被两个东西裁剪,第一个是窗口第二个是视口)。最后,原始的部分,是决定潜在可见被送到一个固定功能子系统称为光栅化程序(最终那些被认为可见的像素被传给下一个阶段:光栅化)。这个块决定哪些像素覆盖的原始(点、线、或三角形)和发送的列表像素alt="原始组装、剪裁和光栅化">
, xw, yw,和zw产生的顶点的坐标窗口空间(这里,yw, zw是输出的窗口坐标系下的坐标),和xd,码,zd传入的顶点的坐标归一化设备空间(xd、码、zd是输入的NDC坐标)。px和py是像素的窗口的宽度和高度,和n和f是远近z坐标平面的距离,分别(px, py是视口坐标,单位是像素,n, f是近剪裁平面和远剪裁平面的z坐标)。最后,牛,oy, oz视窗的起源(最后,牛,oy, oz是视口的原点)

  

扑杀(剔除)

  

进一步处理前一个三角形(在进行更多的处理之前),它可能会选择通过一个阶段称为扑杀(它还要进过一道叫做剔除工作的处理),这决定三角形脸朝向或远离观众实际上可以决定是否继续画基础alt="原始组装、剪裁和光栅化">
,和第i个三角形的顶点的坐标是在窗口空间我⊕1 (i + 1)国防部3(这里是对变量的一些说明,但是由于网页无法展示这些复杂的公式,请参考原书)。如果区域是积极的,那么这个三角形是前置(如果这个面积是正的,那么就是正面);如果是负数,那么它被认为是后面的(如果是负的,那么这会被认为是负面)。这个计算可以逆转的感觉通过调用glFrontFace与dir()设置为GL_CW或GL_CCW(这个计算公式可以通过glFrontFace来进行设置,设置不一样运算公式中的叉乘顺序可能需要反着来)(CW和《代表顺时针和逆时针,分别)。这就是所谓的绕组顺序三角形,并顺时针或逆时针术语指顶点的顺序出现在窗口空间(这个技能被称为三角形的组织顺序,顺时针或者是逆时针决定了三角形的点的连接顺序)。默认情况下,这个状态设置为GL_CCW,表明三角形的顶点以逆时针顺序被认为是前置和那些顶点按顺时针方向被认为是后面的(默认情况下,OpenGL中是逆时针顺序,也就是说,那些逆时针组织的顶点组成的面是三角形的正面)。如果状态是GL_CW,那么就是否定之前扑杀过程中使用(如果是顺时针的情况,剔除的公式反过来就好了,如3.3图所示)。图3.3显示图片的目的是说明
原始组装、剪裁和光栅化
一旦面临三角形的方向已经确定,OpenGL能够丢弃前置,后面的,甚至这两种类型的三角形(当三角形的正面和反面被确定下来后,OpenGL就可以有条件做剔除了)。默认情况下,OpenGL渲染所有三角形,不管他们面临的(默认情况下,OpenGL会渲染所有三角形,无论是前面还是后面)。打开扑杀,叫glEnable()和上限设置为GL_CULL_FACE(为了开启剔除,你需要调用glEnable,传入GL_CULL_FACE)。当启用了扑杀,OpenGL进行筛选,后面的三角形在默认情况下(当你开启了剔除的时候,OpenGL默认会剔除背面)。改变哪些类型的三角形扑杀,叫glCullFace()与脸GL_FRONT, GL_BACK,或GL_FRONT_AND_BACK。(你也可以通过glCullFace去设置将被剔除的面),点和线没有任何几何区域,这面临计算并不适用于他们,他们不能在这个阶段中(由于点和线无法计算面积,所以剔除这个过程不会被用于点和线上)。

  

光栅化(光栅化)

  

光栅化是确定哪些片段的过程可能是由一个原始如一行或一个三角形(光栅化是确定哪个像素会被什么图元覆盖的问题)。这样做有无数的算法,但大多数OpenGL系统将解决half-space-based方法三角形(有很多算法可以做这件事,但是大部分OpenGL会使用half-space-based),因为它非常适用于并行实现(因为这个算法可以很好的并行处理图元)。从本质上讲,OpenGL将决定一个三角形的边界框窗口坐标和测试每一个片段里面来确定是否内部或外部的三角形(基本上,OpenGL会使用一个包围盒来计算窗口坐标系里的三角形是否在这个包围盒里面)。null   null   null   null   null

原始的组装、剪裁和光栅化