OpenGL超级宝典第七章学习笔记:顶点处理与绘图命令

news2024/11/24 19:58:42
前言
本篇在讲什么

OpenGL蓝宝书第七章学习笔记
本篇适合什么

适合初学OpenGL的小白
本篇需要什么

C++语法有简单认知
OpenGL有简单认知
最好是有OpenGL超级宝典蓝宝书
依赖Visual Studio编辑器

本篇的特色

具有全流程的图文教学
重实践,轻理论,快速上手
提供全流程的源码内容


★提高阅读体验★

👉 ♠ 一级标题 👈

👉 ♥ 二级标题 👈

👉 ♣ 三级标题 👈

👉 ♦ 四级标题 👈


目录

  • ♠ 顶点处理
    • ♥ 顶点着色器的输入
    • ♥ 顶点着色器的输出
  • ♠ 绘图命令
    • ♥ 使用基元重启合并几何结构
    • ♥ 实例化
    • ♥ 间接绘制
  • ♠ 变换顶点的保存
    • ♥ 使用变换反馈
    • ♥ 开始、暂停和停止变化反馈
  • ♠ 推送
  • ♠ 结语


♠ 顶点处理

♥ 顶点着色器的输入

这里重新介绍了一遍关于顶点着色器中数据的输入方式,绑定缓冲映射的方式,这一部分,在前面章节关于缓冲的内容中有详细的介绍,主要是下面两个接口的内容,这里不在过多介绍

glVertexAttribFormat
glVertexAttribBinding

♥ 顶点着色器的输出

下面是我们之前章节见到嘴普遍的一个顶点着色器,OpenGL定义了几个输出变量

"#version 420 core                                                 \n"
"                                                                  \n"
"void main(void)                                                   \n"
"{                                                                 \n"
"    const vec4 vertices[] = vec4[](vec4( 0.25, -0.25, 0.5, 1.0),  \n"
"                                   vec4(-0.25, -0.25, 0.5, 1.0),  \n"
"                                   vec4( 0.25,  0.25, 0.5, 1.0)); \n"
"                                                                  \n"
"    gl_Position = vertices[gl_VertexID];                          \n"
"}                                                                 \n"
  • gl_Position
  • gl_ClipDistance[]
  • gl_CullDistance[]
  • gl_PointSize

其中gl_Position、gl_ClipDistance[]、gl_CullDistance[]用于裁剪和剔除
其中gl_PointSize用于空值可渲染的各点的尺寸


♠ 绘图命令

  • glDrawArrays
  • glDrawElements

二者作用都是从一个数据数组中提取数据渲染基本图元

glDrawArrays不需要索引,按照顶点在缓存中出现的顺序输入顶点着色器

glDrawElements从索引数组中按照顺序执行绘图命令

  • 绘图类型矩阵
绘图类型命令
直接、非索引glDrawArraysInstancedBaseInstance()
直接、索引glDrawElementsInstancedBaseVertexBaseInstance()
间接、非索引glMultiDrawArraysIndirect()
间接、索引glMultiDrawElementsIndirect()

以上是最常用的OpenGl绘图命令子集,所有其他OpenGL绘图命令都可以用这些函数表达

  • glDrawElementsbaseVertex()

glDrawElements的高级版本,需要额外参数basevertex基点,通过基点可以在统一缓存中存储大量不同的几何结构


♥ 使用基元重启合并几何结构

利用工具将大量三角形几何转化为三角形条带以便达到性能优化的目的

在条带应用程序未能完成好工作或如果模型本身不适合条带化,则可抵消起初使用条带所带来的任何性能增益

此时有帮助的功能即使基元重启,其会通知OpenGL条带何时结束,何时开始新条带的生成

基元重启应用于GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_LINE_STRIP, GL_LINE_LOOP几何结构类型

  • 启用
glEnable(GL_PRIMITIVE_RESTART)
  • 禁用
glDisable(GL_PRIMITIVE_RESTART)

启用基元重启是OpenGL会监视特殊的索引值来确定条带的结束和开始,通过下面接口设置特殊索引

glPrimitiveRestartIndex(index)

♥ 实例化

应用中,我们存在同时绘制大量相同对象的情况,频繁重复调用单一绘制命令,不可取,使用接口glDrawArraysInstanced()glDrawElementsInstanced()

  • glDrawArraysInstanced
  • glDrawElementsInstanced

二者相当于glDrawArrays和glDrawElements的进阶版本,增加参数instancecount,为实例个数


♥ 间接绘制

之前介绍的都是直接绘制,将各个参数直接传递给函数,还有一种是提前把绘图命令放到缓存,调用间接绘制命令执

  • glDrawArraysIndirect()
typedef  struct {
   GLuint  vertexCount;
   GLuint  instanceCount;
   GLuint  firstVertex;
   GLuint  baseInstance;
} DrawArraysIndirectCommand;

缓存中数据形式

  • glDrawElementsIndirect()
typedef  struct {
   GLuint  vertexCount;
   GLuint  instanceCount;
   GLuint  firstVertex;
   GLuint  baseVertex;
   GLuint  baseInstance;
} DrawArraysIndirectCommand;

缓存中数据形式


♠ 变换顶点的保存

在OpenGL中,可将顶点、曲面细分评估或几何着色器的结果保存在一个或多个缓存对象中,这种特征也叫作变换反馈

将一组特定属性输出写入一组缓存中

其写入的数据可通过glGetBufferSubData()等函数或使用glMapBuffer()映射到应用程序的地址空间内


♥ 使用变换反馈

  • 告知OpenGL记录数据
glTransformFeedbackVaryings()

♥ 开始、暂停和停止变化反馈

  • 激活反馈模式
void glBegainTransformFeedback(GLenum primitiveMode)
  • 暂停记录
void glPauseTransformFeedback()
  • 重启
void glResumeTransformFeedback()

♠ 推送

  • Github
https://github.com/KingSun5

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/508265.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Playground AI:免费绘画图像创作工具

【产品介绍】 Playground AI是一个免费的在线 AI绘画 图像创作工具。你可以用它来创作艺术作品、社交媒体帖子、演示文稿、海报、视频、logo 等等。 Playground AI 的核心技术是基于深度学习的图像生成模型,它可以根据你的输入文字或图片,自动合成出高质…

数组的应用

数组的应用 一、数组的定义二、切片替换删除数值元素 二、数组追加元素三、数组与函数相结合 一、数组的定义 相当于一串数据的集合,以空格相间隔的字符串列表,两边用括号括起来 echo ${shuzu[]}中的代表着显示所有的下标内容,当然&#…

【C++初阶】类和对象(三)

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C初阶 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【C初阶】…

无线蓝牙耳机佩戴舒适的有哪几款?佩戴舒适的蓝牙耳机推荐

自从真无线蓝牙耳机产品推出以来,它已经逐渐成为了当代年轻人外出必带的随身数码产品。虽然市面上不缺好产品,但大家对于蓝牙耳机的佩戴舒适度害死更加重要的,下面就来分享几款佩戴舒适的蓝牙耳机吧。 一、南卡小音舱Lite2蓝牙耳机 参考价格…

Android studio单独导入官方例程camera-calibration

1.官方例程camera-calibration 2.将官方例程camera-calibration copy到AndroidStudioProjects项目目录下 3修改AndroidManifest.xml <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android“http://schemas.android.com/apk/res/andr…

2007年计算机真题

2007年计算机真题 数学基础部分 一、用逻辑符号表达下列语句&#xff08;每小题 2 分&#xff0c;共 4 分&#xff09; 1&#xff0e;分别用两种量词形式写出&#xff1a;在北京居住的人未必都是北京人。 答: 全域: 所有人 P ( x ) \mathrm{P}(\mathrm{x}) P(x) 表示 x \…

「企业应用架构」应用架构概述

在信息系统中&#xff0c;应用架构或应用架构是构成企业架构&#xff08;EA&#xff09;支柱的几个架构域之一 应用架构描述了业务中使用的应用程序的行为&#xff0c;重点是它们如何相互之间以及如何与用户交互。它关注的是应用程序消费和生成的数据&#xff0c;而不是它们的内…

问题杂谈(三十)项目中引入Geotools

步骤 在pom.xml中确定好需要引入的模块&#xff0c;根据自己的需要修改 <!--geotool工具包--><dependency><groupId>org.geotools</groupId><artifactId>gt-epsg-hsql</artifactId><version>27.1</version></dependency&g…

这个学期,110多所高校把AI和大模型带进校园

2023 年春季学期&#xff0c;飞桨校园 AI Day 已登陆全国 114 所高校&#xff0c;为同学们提供了丰富的 AI 学习交流机会。 截至目前&#xff0c;超过 400 所高校的同学线上参与 AI 知识竞赛 PK &#xff0c;累计 2 万余名同学参与春季 AI Day 活动&#xff0c;更有 65 所高校举…

Express框架的路由配置

Express 是一个流行的基于 Node.js 的 Web 开发框架&#xff0c;它可以帮助我们快速搭建一个 Web 应用程序。在 Express 中&#xff0c;路由是一个非常重要的概念。路由指的是根据客户端请求的不同路径和 HTTP 方法来执行不同的处理逻辑。在本篇博客中&#xff0c;我们将介绍如…

美团太细了,HashMap可以存null,ConcurrentHashMap不可以,为什么?

△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 420 篇原创分享 作者 l Hollis 来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09; 我们知道&#xff0c;ConcurrentHashMap在使用时&#xff0c;和HashMap有一个比较大的区别&#xff0c;那就是HashM…

基于Spring Boot的在线考试系统

系统分析 可行性分析 一个完整的系统&#xff0c;可行性分析是必须要有的&#xff0c;因为关系到系统生存问题&#xff0c;对开发的意义进行分析&#xff0c;能否通过本系统来补充线下在线考试管理模式中的缺限&#xff0c;去解决其中的不足等&#xff0c;通过对本系统&#…

FastStone Capture安装、注册及使用教程(截屏、滚动截图、录屏、图片编辑工具)

FastStone Capture是一款集截屏、滚动截图、录屏、图片编辑为一体轻量级截图软件。免费试用30天。 如果你需要找一个具有上述红色字描述的功能的软件的话&#xff0c;可以继续往下阅读。若是你想找一个截图贴图的软件&#xff0c;可以参考&#xff1a; Snipaste介绍、安装、使用…

学系统集成项目管理工程师(中项)系列19b_成本管理(下)

1. 成本估算 1.1. 编制完成项目活动所需资源的大致成本 1.2. 在设计阶段多做些额外的工作可能减少执行阶段和产品运行时的成本 1.3. 项目估算的准确性随着项目的进展而提高 1.3.1. 【19下选48】 1.4. 针对完成活动所需资源的可能成本进行的量化评估 1.5. 容易被忽视的主要…

如何从0开始系统的学习kotlin?

Kotlin强大的静态语言特性相信不用我多讲&#xff0c;大家都或多或少明白一些。无论是对于安卓程序员还是JavaEE程序员来说&#xff0c;掌握Kotlin都是十分有必要的。 Kotlin作为谷歌官方支持的编程语言&#xff0c;目前&#xff0c;不少公司的Android开发工程师岗位表示要有K…

基于springboot广场舞团

系统分析 系统可行性分析 1、经济可行性 由于本系统本身存在一些技术层面的缺陷&#xff0c;并不能直接用于商业用途&#xff0c;只想要通过该系统的开发提高自身学术水平&#xff0c;不需要特定服务器等额外花费。所有创造及工作过程仅需在个人电脑上就能实现&#xff0c;使…

[架构之路-193]-《软考-系统分析师》-2-应用数学 - 项目周期与关键路径(PERT图、甘特图、单代号网络图、双代号网络图)

1. 关键概念 1.1 关键路径 关键路径通常&#xff08;但并非总是&#xff09;是决定项目工期的进度活动序列。它是项目中最长的路径&#xff0c;即使很小浮动也可能直接影响整个项目的最早完成时间。关键路径的工期决定了整个项目的工期&#xff0c;任何关键路径上的终端元素…

asp.net+C#德育课程分数统计管理系统

本中小学德育管理系统主要学校内部提供服务&#xff0c;系统分为管理员&#xff0c;教师和学生3个大模块。 本研究课题重点主要包括了下面几大模块&#xff1a;用户登录&#xff0c;管理员信息管理学生信息管理&#xff0c;教师信息管理&#xff0c;班级成绩管理&#xff0c;学…

YOLOv5改进系列(2)——添加CBAM注意力机制

【YOLOv5改进系列】前期回顾&#xff1a; YOLOv5改进系列&#xff08;0&#xff09;——重要性能指标与训练结果评价及分析 YOLOv5改进系列&#xff08;1&#xff09;——添加SE注意力机制 目录 &#x1f680;一、CBAM注意力机制原理 1.1 CBAM方法介绍 1.2 通道注意力机制…

Android车载应用开发和移动应用开发有什么区别?

背景 2022年对我来说是非常糟糕的一年&#xff0c;因为疫情原因导致公司收益不好&#xff0c;所有我被辞退了&#xff0c;离职之后呢有尝试过头简历面试&#xff0c;发现面试的机会很少&#xff0c;经过一段时间的沉淀后&#xff0c;我萌生了转行做车载的想法。为什么会产生这…