顶点(vertexs) 图元(primitives) 片元(fragments,又叫片断) 像素(pixels)

阶段1.  顶点 ->图元

几何顶点被组合为图元(点,线段或多边形),然后图元被合成片元,最后片元被转换为帧缓存中的象素数据。

阶段2.  图元  ->片元

图元被分几步转换为片元:图元被适当的裁剪,颜色和纹理数据也相应作出必要的调整,相关的坐标被转换为窗口坐标。最后,光栅化将裁剪好的图元转换为片元。

1) 裁剪

在裁剪时点,线段和多边形处理略微不同。对于点,要么保留原始状态(在裁剪体内部),要么被裁掉(在裁剪体外部)。对于线段和多边形来说,如果部分在裁剪体外部,则需要在裁剪点生成新的几何顶点。对于多边形,还需要在新增的顶点间增加完整的边。不论裁剪了线段还是多边形,都需要给新增几何点赋予边界标志、法线、颜色和纹理坐标信息。

裁剪过程时两步:

a 应用程序指定裁剪(Application-specific clipping),一旦组合图元完成后,如果在程序中用glClipPlane()函数定义了任意的裁剪面,就进行裁剪。

b 视景体裁剪(View volume clipping),随后,图元被投影矩阵投影(进入裁剪坐标系),被相应的视景体裁剪。投影矩阵可以由glFrustum() 或者glOrtho()定义,投影矩阵的操作和上面其他矩阵变换的操作相同。

2) 转换到窗口坐标

裁剪坐标在转换为窗口坐标之前,要除以规格化设备坐标(normalized device coordinates)的w值进行规范化。然后对这些规范化数据进行视口变换(viewport)计算生成窗口坐标。可以用glDepthRange()和glViewport()控制视口大小,决定屏幕上显示图象的区域。

3) 光栅化

光栅化是将一个图元转变为一个二维图象(其实只是布满平面,没有真正的替换帧缓存区)的过程。二维图象上每个点都包含了颜色、深度和纹理数据。将该点和相关信息叫做一个片元(fragment)。(yuyu注:这就是片元和像素之间的关键区别,虽然两者的直观印象都是的像素,但是片元比像素多了许多信息,在光栅化中纹理映射之后图元信息转化为了像素)在这个阶段,对象素绘制和位图进行操作需要用到当前栅格位置(用glRasterPos*()定义)。正如上面讨论的,三种图元的光栅化方法是不同的,另外,象素块和位图也需要光栅化。

a)图元

采用glPointSize(), glLineWidth(), glLineStipple()和 glPolygonStipple()函数可以选择图元的光栅化维数和模式。另外,还可以用glCullFace(), glFrontFace()和glPolygonMode()控制多边形正反面不同的光栅化效果。

b)象素

有几个函数实现象素保存和转换。函数glPixelStore*()用于内存中的象素是如何保存的。glPixelTransfer*() and glPixelMap*()用于象素在写入帧缓冲区前是如何处理的。glDrawPixels()定义了一个象素矩形。用glPixelZoom()实现象素的缩放。

c)位图

位图是具有特定片元模式的0和1的矩形。每个片元有相同的相关数据。可以用glBitmap()定义。

d)纹理存储

纹理贴图是将指定的部分纹理图象映射到每个图元上。每个片元(fragment)具有的纹理坐标属性,该坐标与纹理图象坐标对应,得到纹理图象该位置的颜色值来修改片元的RGBA颜色,从而完成这个映射过程。用glTexImage2D()或glTexImage1D()来定义纹理图象。glTexParameter*()和glTexEnv*()来控制纹理如何解释和应用到一个片元上。

e)雾

已经光栅化的片元具有纹理贴图修正后颜色,可以采用融合因子再融合雾颜色,该融合因子大小根据视点和片元间的距离来定。用glFog*()指定雾化颜色和融合因子。

阶段3.  片元->像素

OpenGL允许光栅化生成一个片元,只要该片元通过一系列检测就可以修改帧缓冲区中对应象素。如果它通过测试,片元数据可以直接替换帧缓冲区中的已有值,或者和已有值合并,这取决于设置的模式。

1)象素所有权(ownership)检测

第一个测试是判断在帧缓冲区中的象素所对应的某个片元是否属于当前OpenGL上下文。如果属于,片元进行下一个测试。如果不属于,窗口系统决定是否忽略该片元,或者是否进行下一步片元操作。

2)裁剪检测

用glScissor()函数,可以定义一个任意屏幕校准矩形,在该矩形外的片元将被忽略。

3)Alpha检测

Alpha测试只能在RGBA模式下进行,如果片元的alpha值超出一个固定参照值,片元将被忽略,这个比较函数可以用glAlphaFunc()实现并设定参考值。

4)模版检测

当模版缓冲区的值超出一个参照值,模版测试将有条件的忽略该片元。这个比较函数和固定值可以用glStencilFunc()实现。不论图元通过或没有通过模版测试,模版缓冲区中的值会根据glStencilOp()函数进行修改。

5)深度检测

当深度缓冲区的值与参照值的比较失败,深度测试忽略该片元。GlDepthFuc()用来执行这个比较命令。如果模版启用,深度比较的结果会影响模版缓冲区值的更新。

6)融合

融合合并了一个片元R、G、B和A值和存储在帧缓冲区对应位置的这些值。融合只能在RGBA模式下实现,它的实现需要片元的alpha值和对应当前存储象素,还需要RGB值。用glBendFun()控制,可以修改融合因子的源和目标。

7)抖动

如果启动抖动,片元的颜色或者颜色索引采用抖动算法。这个算法只需要片元的颜色值和它的x和y坐标。

8)逻辑操作

最后,在片元和帧缓冲区对应值之间要进行一个逻辑操作,结果将替换当前帧缓冲区的值。用glLogicOp定义想要的逻辑操作。这个逻辑操作只能在颜色索引模式下运行,而不能在RGBA模式运行。

象素

在OpenGL流水线的上个阶段,片元转换为帧缓冲区中的象素。帧缓冲区实际上是一组逻辑缓冲区——包括颜色缓冲区、深度缓冲区、模版缓冲区和累积缓冲区。颜色缓冲区包括左、前右、后左、后右和一些辅助缓存值(auxiliary buffers)。可以直接从中读取或者复制。对于OpenGL不同上下文,这些缓冲区可能不全

1)帧缓冲区操作

用glDrawBuffer为绘图选择一个颜色缓冲区。另外在预片元化(per-fragment)操作后,可以用四个不同函数保留写入这些逻辑缓冲区的操作,glIndexMask(), glColorMask(), glDepthMask(), and glStencilMask()。glAccum()对累积缓冲区进行操作。最后glClearColor(), glClearIndex(), glClearDepth(), glClearStencil()和glClearAccum().对不同缓冲区中指定相对应的颜色值、颜色索引值、深度值、模板值和累积值。

2)读取和复制象素

用glReadPixel()从帧缓冲区中把象素读到内存中,进行各种操作,保存处理结果。另外,可以用glCopyPixel()从帧缓冲区中复制一块象素到另一个帧混存。glReadBuffer()可以读取和复制颜色缓冲区中的象素。

转载于:https://www.cnblogs.com/ghw0501/archive/2012/03/29/4733914.html

顶点(vertexs) 图元(primitives) 片元(fragments片断) 像素(pixels)相关推荐

  1. 图元和片元_OpenGL中的顶点、 图元、片元、像素的含义

    顶点(vertexs) 图元(primitives) 片元(fragments,又叫片断) 像素(pixels) 阶段1. 顶点 - > 图元 几何顶点被组合为图元(点,线段或多边形),然后图元 ...

  2. 顶点、 图元、片元、像素的含义

    阶段1.  顶点 ->图元 几何顶点被组合为图元(点,线段或多边形),然后图元被合成片元,最后片元被转换为帧缓存中的象素数据. 阶段2.  图元  ->片元 图元被分几步转换为片元:图元被 ...

  3. 图元和片元_OpenGL渲染流水线中顶点(vertexs) 图元(primitives) 片元(fragments片断) 像素(pixels)的含义...

    顶点(vertexs) 图元(primitives) 片元(fragments,又叫片断) 像素(pixels) 阶段1.  顶点 ->图元 几何顶点被组合为图元(点,线段或多边形),然后图元被 ...

  4. 图元和片元_顶点(vertexs) 图元(primitives) 片元(fragments片断) 像素(pixels)...

    顶点(vertexs) 图元(primitives) 片元(fragments,又叫片断) 像素(pixels) 阶段1.  顶点 ->图元 几何顶点被组合为图元(点,线段或多边形),然后图元被 ...

  5. 3D可视化开发(基于顶点着色器和片元着色器)

    3D可视化开发(基于顶点着色器和片元着色器) 背景:最近在做大屏的3d地图可视化开发,技术采用three.js+glsl这样的是一种实现方式,其中使用glsl实现顶点着色器和片元着色器. GLSL G ...

  6. 《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》——6.5节光照的每顶点计算与每片元计算...

    本节书摘来自异步社区<OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例>一书中的第6章,第6.5节光照的每顶点计算与每片元计算,作者 吴亚峰,更多章节内容可以访问云栖社区&q ...

  7. 顶点着色器到片元着色器的过程,varying变量

    varying 变量: 从顶点着色器向片元着色器中传入数据. varying 变量只能是float(以及相关的vec2,vec3,vec4,mat2,mat3,mat4). 前面我们了解到顶点着色器是 ...

  8. webgl着色器初学习-顶点着色器和片元着色器

    文章目录 webgl工作步骤 顶点着色器 片元着色器 案例 webgl工作步骤 每一个像素点都将执行这两个着色器 我理解为这两个着色器,顶点着色器决定渲染位置 ,片元着色器决定颜色 顶点着色器 编写一 ...

  9. Three.js基础之图元

    Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多.使用最广泛的三维引擎. 图元(Primitives), 即threejs 内置的一些基 ...

最新文章

  1. 半平面交比较好的博客
  2. @query 注解的定义_SpringDataJpa(5)---定义查询方法
  3. ping程序和tracert(traceroute)背后的故事--ICMP协议
  4. 特邀丨前阿里巴巴产品运营专家、中国计算机学会专业会员,揭秘增长共同点
  5. HBase ACL管理 Hbase 权限管理
  6. STL(四)——map映射
  7. html label标签 ie6,IE6 IE7 IE8三大浏览器的CSS兼容速查表
  8. Luogu1640 连续攻击游戏
  9. php descryptoserviceprovider,[WPF]C#和php实现DES加密和解密
  10. python日期,从int格式为时间格式
  11. Linux 禁止和开启 ping 的方法
  12. Android【报错】Description Resource Path Location Type Unparsed aapt error(s)! Cheheck the console for o
  13. 华为鸿蒙手机系统什么时候开始更新_华为鸿蒙系统2.0什么时候可以升级
  14. microchip-02之MCC工具安装
  15. 打造跳跃音波播音乐放器(Electron+Nodejs+React)
  16. 马里兰大学计算机世界排名,2019上海软科世界一流学科排名计算机科学与工程专业排名马里兰大学帕克分校排名第38...
  17. EndNotex9学习备忘
  18. 痞子衡嵌入式:导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之QE bit...
  19. 基于matlab的船体三维模型仿真
  20. mysqldump出现killed问题

热门文章

  1. python解压zip文件_Python中最快解压zip文件的方法
  2. Python小程序:你看?这千年难遇的雪景—简直“美到犯规” 【满屏雪花飞舞 】
  3. 隐藏表白图“我喜欢你”就像你看不见但它也依然存在
  4. r语言 col_R语言代码相关疑问标准提问
  5. 简述安装Tsurugi Linux发行版
  6. Linux中如何使用Sipcalc计算IP子网
  7. 单片机有什么好的网课?
  8. java布局工具,Java Swing:库,工具,布局管理器
  9. 主机配置_分享几套电脑主机配置
  10. 思科服务器查看生成树协议,CISCO中生成树协议的配置