首页>文章>编程>图形编程

用OpenGL绘图

学习如何识别OpenGL中可用的所有渲染原语,初始化和填充用于渲染几何的数据缓冲区,并使用实例渲染等高级技术优化渲染。
这一章摘自这本书

章的目标

读完本章,你将能够:

  • 识别OpenGL中可用的所有渲染原语。
  • 初始化和填充用于渲染几何图形的数据缓冲区。
  • 优化渲染使用先进的技术,如实例化呈现

OpenGL的主要用途是将图形渲染到帧缓冲区中。为了实现这一点,复杂的对象被分解成原语-点、线和三角形,当以足够高的密度绘制时,会产生2D和3D物体的外观。OpenGL包含许多用于渲染这些原语的函数。这些函数允许您描述内存中原语的布局,要呈现多少个原语,以及它们采用什么形式,甚至可以通过一个函数调用呈现同一组原语的多个副本。这些可以说是OpenGL中最重要的功能,因为没有它们,你将无法做很多事情,只能清除屏幕。

本章包括以下主要部分:

  • “OpenGL图形原语”描述了OpenGL中可用的图形原语,你可以在渲染中使用。
  • “OpenGL缓冲区中的数据”解释了在OpenGL中处理数据的机制。
  • “顶点规范”概述了如何使用顶点数据进行渲染,以及如何使用顶点着色器进行处理。
  • “OpenGL绘图命令”介绍了一组导致OpenGL绘图的函数。
  • “实例渲染”描述了如何使用相同的顶点数据高效地渲染多个对象。

OpenGL图形原语

OpenGL包括对许多基本类型的支持。最终,它们都被渲染为三种类型之一——点、线或三角形。线条和三角形类型可以组合在一起形成条形、环状(用于线条)和扇形(用于三角形)。点、线和三角形是本地的大多数图形硬件支持的基本类型。1OpenGL支持其他基本类型,包括补丁,它们被用作tessellatator和邻接原语它们被设计用作几何着色器的输入。第9章介绍了镶嵌(和镶嵌着色器),第10章介绍了几何着色器。补丁和邻接基本类型将在这些章节中详细介绍。在本节中,我们只讨论点、线和三角形基本类型。

点由单个顶点表示。顶点表示四维空间中的一个点齐次坐标。因此,点实际上没有面积,因此在OpenGL中,它实际上是显示器(或绘制缓冲区)的正方形区域的模拟物。当渲染点时,OpenGL使用一组规则来确定哪些像素被点覆盖光栅化规则。在OpenGL中栅格化点的规则非常简单——如果样本落在窗口坐标中以点的位置为中心的正方形内,则认为它被点覆盖。正方形的边长等于点的大小,这是固定的状态glPointSize ()),或者写入gl_PointSize顶点、镶嵌或几何着色器的内置变量。写入的值gl_PointSize只有当GL_PROGRAM_POINT_SIZE被启用时,才会在着色器中使用,否则它将被忽略并设置固定状态值glPointSize ()使用。

默认的点大小是1.0。因此,当点被渲染时,每个顶点本质上成为屏幕上的单个像素(当然,除非它被剪切)。如果增加点的大小(用glPointSize (),或将大于1.0的值写入gl_PointSize),那么每个点顶点可能最终点亮一个以上的像素。例如,如果点的大小为1.2像素,并且点的顶点正好位于像素中心,那么只有该像素将被照亮。然而,如果点的顶点正好位于两个水平或垂直相邻的像素中心之间,那么这两个像素都将被照亮(即两个像素将被照亮)。如果点的顶点位于四个相邻像素之间的中点,那么所有四个像素都将被点亮——一个点总共有四个像素被点亮!

点精灵

当你用OpenGL渲染点时,片段着色器会为点中的每个片段运行。每个点本质上是屏幕的一个正方形区域,每个像素都可以用不同的颜色着色。你可以在碎片着色器中分析计算颜色,或者使用纹理来遮蔽点。为了帮助实现这一点,OpenGL片段着色器包括一个特殊的内置的变量被称为gl_PointCoord它包含当前片段所在点内的坐标。gl_PointCoord仅在片段着色器中可用(在其他着色器中包含它没有多大意义),并且仅在渲染点时具有定义值。只需使用gl_PointCoord作为纹理坐标的来源,可以使用位图和纹理来代替简单的正方形块。结合alpha混合或丢弃碎片(使用丢弃的关键字),甚至可以创造点精灵形状奇怪。

我们将通过一个例子重新审视点精灵。如果你想跳过,可以参考第346页的“Point Sprites”。

线,条和环

在OpenGL中,术语线段,而不是数学家在两个方向上延伸到无穷大的版本。因此,单独的直线由顶点对表示,每个顶点代表直线的端点。线条也可以连接在一起,以表示一系列相连的线段,并可选择关闭。闭序列称为a行循环,而开放序列(不闭合的序列)称为a线带。与点一样,线在技术上没有面积,因此使用特殊的光栅化规则来确定线段光栅化时应该点亮哪些像素。线光栅化的规则被称为菱形出口规则。它在OpenGL规范中有详细介绍。然而,我们试图在这里解释一下。当栅格化一条从a点到B点的线时,如果这条线穿过在屏幕上像素的正方形区域内绘制的菱形形状的假想边缘,则应该点亮一个像素-除非该菱形包含点B(即,线的末端在菱形内)。这样,如果从B点到C点绘制另一条线,B所在的像素只被点亮一次。

菱形退出规则足以满足细线,但OpenGL允许您使用glLineWidth ()函数(等价于glPointSize ()行)。

没有等价物gl_PointSize对于线条——线条在OpenGL中以固定的宽度渲染,直到状态改变。当线宽大于1时,简单地复制该线宽度乘以水平或垂直。如果这行是y-major(即,它的垂直延伸比水平延伸更远),它是水平复制的。如果是的话x-major然后垂直复制。

OpenGL规范在如何表示线的末端以及在关闭抗锯齿时如何栅格化宽线方面有些自由。当开启抗混叠时,线条被视为沿直线对齐的矩形,宽度等于当前线条宽度。

三角形,条形和扇形

三角形由三个顶点的集合组成。当渲染单独的三角形时,每个三角形都独立于所有其他三角形。三角形是通过将三个顶点中的每一个投影到屏幕空间并在边缘之间形成三条边来渲染的。如果一个样本位于所有的正侧,则认为它是被覆盖的一半的空间由顶点之间的直线形成的。如果两个三角形共享一条边(因此是一对顶点),则不能在两个三角形内考虑单个样本。这一点很重要,因为尽管OpenGL规范允许光栅化算法的一些变化,但管理共享边缘上的像素的规则相当严格:

  • 两个三角形之间的共享边缘上的任何像素都不应该被照亮。
  • 两个三角形之间的共享边缘上的像素不应该被一个以上的三角形照亮。

这意味着OpenGL将可靠地栅格化具有共享边缘的网格,在三角形之间没有间隙,并且没有透支2这在光栅化三角形时很重要球迷。当一个三角形条被渲染时,前三个顶点形成第一个三角形,然后每个后续顶点与前一个三角形的最后两个顶点一起形成另一个三角形。这在图3.1

图3.1

图3.1。三角形带的顶点布局

渲染三角形扇形时,第一个顶点形成一个共享点,该点包含在每个后续三角形中。然后使用共享点和接下来的两个顶点形成三角形。一个任意复杂的多边形可以渲染为三角形扇形。图3.2显示三角形扇形的顶点布局。

图3.2

图3.2。三角形风扇的顶点布局

这些基本类型将由下一节将要介绍的绘图函数使用。它们由OpenGL令牌表示,这些令牌作为参数传递给用于渲染的函数。表3.1显示了原始类型到用来表示它们的OpenGL令牌的映射。

表3.1。OpenGL原始模式令牌

原始类型

OpenGL的令牌

GL_POINTS

GL_LINES

线带

GL_LINE_STRIP

行循环

GL_LINE_LOOP

独立的三角形

GL_TRIANGLES

三角形带

GL_TRIANGLE_STRIP

三角形的粉丝

GL_TRIANGLE_FAN

将多边形渲染为点、轮廓或实体

一个多边形有两面——正面和背面——并且可能根据哪一面面向观看者而呈现不同的效果。这允许你有固体物体的剖面图,在里面和外面的部分之间有一个明显的区别。默认情况下,前面和后面都有都是以同样的方式画出来的。若要更改此设置,或仅绘制轮廓或顶点,请使用glPolygonMode ()

反转和剔除多边形面

按照惯例,调用顶点在屏幕上以逆时针顺序出现的多边形前置。你可以构造任何“合理的”固体的表面——数学家会把这样的表面称为可定向流形(球体、甜甜圈和茶壶都是可定向的;克莱因瓶和Möbius条则不是)——来自方向一致的多边形。换句话说,你可以使用所有顺时针多边形或所有逆时针多边形。

假设你一直在描述一个可定向表面的模型,但碰巧它的外部是顺时针方向。你可以通过使用这个函数来交换OpenGL认为的背面glFrontFace (),为正面多边形提供所需的方向。

在一个由不透明多边形构成的完全封闭的表面上,没有一个背面的多边形是可见的——它们总是被正面的多边形掩盖。如果你在这个表面之外,你可能会启用剔除来丢弃OpenGL确定为背面的多边形。类似地,如果你在对象内部,只有背面的多边形是可见的。要指示OpenGL放弃正面或背面的多边形,使用命令glCullFace ()并启用筛选glEnable ()

先进的

用更专业的术语来说,决定一个多边形的面是正面还是背面取决于在窗口坐标中计算的多边形面积的符号。计算这个面积的一种方法是

092年equ01.jpg

在哪里xyxy的窗口坐标th的顶点n-顶点多边形,其中⊕1是(的缩写)+ 1) modn,其中mod是模数运算符。

假设已经指定了GL_CCW,如果一个> 0,则认为该顶点对应的多边形是正面的;否则,它是背面的。如果指定了GL_CW,如果一个< 0,则对应多边形为正面;否则,它是背面的。

金宝搏188亚洲体育真人始乐InformIT促销邮件和特别优惠

我希望收到独家报价,并听到有关InformIT及其品牌家族的产品。金宝搏188亚洲体育真人始乐我可以随时退订。

概述


培生教育有限公司(Pearson Education, Inc., 221 River Street, Hoboken, New Jersey 07030)提供本网站,提供可通过本网站购买的产品和服务的信息。

本隐私声明概述了我们对隐私的承诺,并描述了我们如何收集、保护、使用和共享通过本网站收集的个人信息。请注意,培生的其他网站和在线产品及服务有其单独的隐私政策。

信息的收集和使用


为了开展业务并提供产品和服务,培生通过与本网站相关的几种方式收集和使用个人信息,包括:

问题及查询

对于查询和问题,我们会收集查询或问题,以及姓名、联系方式(电子邮件地址、电话号码和邮寄地址)以及通过“联系我们”表格或电子邮件自愿提交给我们的任何其他附加信息。我们使用这些信息来解决询问和回答问题。

在线商店

对于通过本网站上的在线商店下达的订单和购买,我们会收集订单详细信息、名称、机构名称和地址(如适用)、电子邮件地址、电话号码、送货和账单地址、信用卡/借记卡信息、送货选项和任何指示。我们使用这些信息来完成交易、履行订单、与下订单或访问在线商店的个人沟通,以及用于相关目的。

调查

培生可能提供提供反馈或参与调查的机会,包括评估培生产品、服务或网站的调查。参与是自愿的。培生收集调查问题中要求的信息,并使用这些信息来评估、支持、维护和改进产品、服务或网站,开发新产品和服务,进行教育研究以及调查中指定的其他目的。

比赛及绘图

偶尔,我们可能会赞助比赛或绘画。参与是可选的。培生收集参赛者姓名、联系方式和其他填写在参赛表格上的信息,以进行比赛或抽奖。培生可能会根据法律要求,从竞赛或抽奖的获胜者那里收集额外的个人信息,以便颁发奖品和用于税务报告目的。

时事通讯

如果您已选择接收电子邮件通讯或促销邮件和特别优惠,但想取消订阅,只需电子邮件information@金宝搏188亚洲体育真人始乐informit.com

服务公告

在极少数情况下,有必要发布严格与服务相关的公告。例如,如果我们的服务因维护而暂时停止,我们可能会向用户发送电子邮件。一般来说,用户不能选择退出这些通信,但他们可以停用他们的帐户信息。然而,这些通信在本质上不是促销。

客户服务

我们定期与用户沟通,以提供所要求的服务,并且当用户通过我们的网站提交信息时,我们会根据用户的意愿通过电子邮件或电话回复与他们的帐户有关的问题联络表格

其他信息的收集和使用


应用和系统日志

培生自动收集日志数据,以帮助确保本网站的交付、可用性和安全性。日志数据可能包括有关用户或访问者如何连接到本网站的技术信息,例如浏览器类型、计算机/设备类型、操作系统、互联网服务提供商和IP地址。我们将此信息用于支持目的和监控站点的运行状况、识别问题、改进服务、检测未经授权的访问和欺诈活动、预防和响应安全事件以及适当地扩展计算资源。

网络分析

培生可能会使用第三方网络趋势分析服务(包括Google Analytics)来收集访问者信息,如IP地址、浏览器类型、参考页面、访问过的页面以及在特定网站上花费的时间。虽然这些分析服务以匿名方式收集和报告信息,但它们可能会使用cookie来收集网络趋势信息。收集的信息可能使Pearson(但不是第三方web趋势服务)能够将信息与应用程序和系统日志数据链接起来。培生将这些信息用于系统管理、识别问题、改进服务、检测未经授权的访问和欺诈活动、预防和响应安全事件、适当扩展计算资源以及支持和提供本网站及其服务。

Cookies及相关技术

本网站使用cookie和类似的技术来个性化内容,测量流量模式,控制安全性,跟踪本网站信息的使用和访问,并提供基于兴趣的消息和广告。用户可以通过浏览器管理和阻止cookie的使用。禁用或阻止某些cookie可能会限制本网站的功能。

不要跟踪

本网站目前不响应禁止跟踪信号。

安全


培生采用适当的物理、管理和技术安全措施来保护个人信息免遭未经授权的访问、使用和披露。

孩子们


本网站不面向13岁以下儿童。

市场营销


培生可以向用户发送或直接发送营销信息,前提是

  • 培生不会将作为K-12学校服务提供商收集或处理的个人信息用于定向或有针对性的广告。
  • 这种营销符合适用法律和培生的法律义务。
  • 培生不会故意直接或发送营销通信给个人谁表示了偏好不接受营销。
  • 在适用法律要求的情况下,对营销的明示或默示同意存在且未撤销。

培生可以在有限的基础上向第三方服务提供商提供个人信息,仅代表培生或培生作为其服务提供商的关联公司或客户进行营销。营销偏好可能随时发生变化。

更正/更新个人资料


如果用户的个人身份信息发生变化(例如您的邮寄地址或电子邮件地址),我们将提供一种方法来更正或更新用户提供给我们的个人数据。这可以在帐户页面。如果用户不再需要我们的服务,并希望删除他或她的帐户,请联系我们customer-service@金宝搏188亚洲体育真人始乐informit.com我们将处理用户帐户的删除。

选择/退出


用户可以在知情的情况下选择是否继续使用InformIT提供的某些服务。金宝搏188亚洲体育真人始乐如果您选择从我们的邮件列表中删除自己,只需访问以下页面并取消您不再希望接收的任何通信:www.金宝搏188亚洲体育真人始乐informit.com/u.aspx

出售个人资料


培生不会出租或出售个人信息以换取任何金钱。

虽然皮尔逊不出售个人信息,根据内华达州法律的定义,内华达州居民可以通过电子邮件请求不出售他们的个人信息NevadaDesignatedRequest@pearson.com

加州居民补充隐私声明


加州居民应该读读我们的加州居民补充隐私声明连同本私隐声明一并提交。的加州居民补充隐私声明解释培生遵守加州法律的承诺,并适用于通过本网站和服务收集的加州居民的个人信息。

分享与披露


培生可能会在以下情况下披露个人信息:

  • 这是法律规定的。
  • 经个人同意(或其父母同意,如果个人是未成年人)
  • 在法律允许或要求的范围内响应传票、法院命令或法律程序
  • 根据适用法律保护个人、数据、资产和系统的安全
  • 与出售、合资或以其他方式转让部分或全部公司或资产有关,但须遵守本隐私声明的规定
  • 调查或处理实际的或涉嫌的欺诈或其他非法活动
  • 行使其合法权利,包括执行本网站的使用条款或其他合同
  • 培生的附属公司以及为培生工作的其他公司和组织,他们有义务按照本隐私声明保护个人信息的隐私
  • 对于学校、组织、公司或政府机构,培生在学校或代表这些组织、公司或政府机构收集或处理个人信息。

链接


本网站包含到其他网站的链接。请注意,我们不负责此类其他网站的隐私做法。我们鼓励我们的用户在离开我们的网站时保持警惕,并阅读每个收集个人信息的网站的隐私声明。本隐私声明仅适用于本网站收集的信息。

请求及联络


联系我们查阅本私隐声明,或对您的个人资料私隐有任何要求或疑问。

本隐私声明的变更


我们可能会通过更新发布来修改本隐私声明。我们将在公告中注明修订的生效日期。通常,进行更新是为了提供更大的清晰度或符合法规要求的变化。如果更新涉及个人信息的收集、保护、使用或披露的重大变化,培生将通过本网站的显著通知或其他适当方式提供变更通知。在已发布的修改证明生效日期后继续使用本网站。如果您对本隐私声明有任何疑问或疑虑,或对任何修订有任何异议,请与我们联系。

最后更新:2020年11月17日