0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenGL中的顶点、 图元、片元、像素的含义解读

汽车电子技术 来源:apr01博客 作者:apr01博客 2022-10-18 15:12 次阅读

顶点(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()可以读取和复制颜色缓冲区中的像素。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 光栅
    +关注

    关注

    0

    文章

    281

    浏览量

    27475
  • 像素
    +关注

    关注

    1

    文章

    203

    浏览量

    18557
  • OpenGL
    +关注

    关注

    1

    文章

    85

    浏览量

    29214
  • 函数
    +关注

    关注

    3

    文章

    4303

    浏览量

    62411
收藏 人收藏

    评论

    相关推荐

    鸿蒙开发【WebGL】简单了解

    着色器 可以理解为运行在显卡的指令和数据。在WebGL,着色器是用OpenGL ES着色语言(GLSL)编写的。 完整的着色器包括顶点着色器和
    发表于 02-25 21:56

    鸿蒙原生应用服务开发-WebGL网页图形库开发概述

    。 一、 着色器 可以理解为运行在显卡的指令和数据。在WebGL,着色器是用OpenGL ES着色语言(GLSL)编写的。 完整的着色器包括顶点着色器和
    发表于 03-08 14:24

    基于OpenGL的3DS图形文件模型数据的获取

    及特殊效果处理函数等,在虚拟现实、创建三维逼真场景方面是其它软件无法比拟的。在物体的造型方面,OpenGL顶点图元,由点构成线,由线及其拓扑结构构成多边形,然后由点、线、面组成想要绘制的形体。这种造型
    发表于 03-07 11:53

    基于ArkUI框架开发——图片模糊处理的实现

    公式处理的都放到C层处理。 第三、基于系统底层提供的OpenGL,操作顶点着色器及着色器操作GPU,得到我们要的模糊效果。 首先,我们
    发表于 05-05 14:53

    Arm OpenGL ES 3.0开发者指南

    OpenGL ES 3.0是对OpenGL ES 2.0标准的增强。 OpenGL ES 3.0添加了OpenGL 3.x已有的功能。其他
    发表于 08-08 06:03

    Mali和OpenGL ES3.0 指南

    更新的着色语言-GLSL ES 3.0更新的顶点着色使用变换反馈模式许多新对象类型着色器均匀缓冲区顶点数组对象采样器对象同步对象像素缓冲区对象(PBO)
    发表于 08-25 07:10

    在BCB实现全屏幕OpenGL的原理

    其实在BCB实现全屏幕OpenGL的原理是很简单的,只要在窗口OpenGL程序的基础上做一个小小的改动即可:只要将窗口属性修改为WS_POPUP就可
    发表于 09-07 18:13 15次下载

    OpenGL

    OpenGL OpenGL是个专业的3D程序接口,是一个功能强大,调
    发表于 12-25 11:16 593次阅读

    基于OPENGL电力绘图组态软件的开发

    本文结合对 组态软件 的认识与研究开发,介绍了该系统的发展情况及其在电力系统的应用,基于OPENGL 提出了组态软件的设计思想、特点(可视化、窗口化、图元化)以及面向用户的
    发表于 06-30 17:44 0次下载
    基于<b class='flag-5'>OPENGL</b>电力绘图组态软件的开发

    浅谈OpenGL的光照技术

    当不开启光照时,使用顶点颜色来产生整个表面的颜色。用glShadeModel可以设置表面内部像素颜色产生的方式。GL_FLAT/GL_SMOOTH.
    发表于 05-08 10:21 3570次阅读
    浅谈<b class='flag-5'>OpenGL</b><b class='flag-5'>中</b>的光照技术

    OpenGL绘制图形单元的技巧介绍

    OpenGL要求:指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶点将被忽略)。在调用glBegin函数时,我们需要传入一个参数,以告诉OpenGL我们
    发表于 05-07 08:31 2696次阅读

    OpenGL的深度、深度缓存、深度测试

    其次,OpenGL会计算这些表面和观察平面的距离。如果启用了深度缓冲区,在绘制每个像素之前,OpenGL会把它的深度值和已经存储在这个像素的深度值进行比较。新
    的头像 发表于 07-05 16:49 3680次阅读
    <b class='flag-5'>OpenGL</b><b class='flag-5'>中</b>的深度、深度缓存、深度测试

    如何把OpenGL3D坐标转换成2D坐标

    OpenGL,一切事物都在3D空间中,但我们的屏幕坐标确实2D像素数组,OpenGL大部分工作就是把3D坐标转换成适应屏幕的2D像素。3
    的头像 发表于 07-09 10:40 8555次阅读

    英特尔OpenGL ES API的新功能介绍

    演示OpenGL ES API的新功能。
    的头像 发表于 11-06 06:26 3330次阅读

    顶点序下图的支配集算法综述

    文中将粗糙集理论的属性序引入到图论,研究顶点序下图的支配集问题。首先,在图的顶点集上定义一个全序关系,称为顶点序。然后,利用
    发表于 04-27 10:34 1次下载
    <b class='flag-5'>顶点</b>序下图的支配集算法综述