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

前言
本篇在讲什么

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

♠ 结语

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

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenGL超级宝典第七版源码是OpenGL编程的一个重要资料。该源码提供了一系列OpenGL实现的代码,涵盖了各种不同的OpenGL功能,包括基本渲染、矩阵操作、纹理贴图、着色器、光照、投影变换等方面的知识。 该源码的编写可帮助初学者更加深入地理解OpenGL的实现原理和机制,并且能够帮助开发者更加高效地进行OpenGL开发。在学习之初,可以通过阅读源码,理解OpenGL的概念、操作,同时也能够加深对于OpenGL的理解,掌握如何进行OpenGL编程。对于已经具备一定OpenGL经验的开发者,该源码也可以作为参考资料,提高OpenGL的开发水平及编写效率。 总的来说,OpenGL超级宝典第七版源码是一份非常有价值的资料,可供初学者、有经验的开发者和教师使用。通过学习该源码,开发者可以更加全面地了解OpenGL的工作原理,从而编写出更加高效、可靠的OpenGL应用程序,同时也可让用户获得更好的使用体验。 ### 回答2: OpenGL超级宝典第七版是一本OpenGL编程的优秀书籍,该书提供了详细的OpenGL编程实例及源码。书中代码使用了OpenGL 4.3版本进行编写,包括了OpenGL的基本概念、渲染流水线、光照、阴影、几何体绘制、纹理、高级技巧等内容。 该书源码共包含20个实例,从简单到复杂逐渐深入,涵盖了OpenGL编程的基本知识点,对OpenGL编程入门有很好的指导作用。该书源码使用了C++语言进行编写,注释清晰易懂,让读者能够更好地理解OpenGL编程的原理。 此外,源码支持跨平台编译,可以运行在Windows、Linux和Mac OS X等系统上。通过阅读书中实例代码,读者可以更加深入地了解OpenGL编程的各个方面,提高OpenGL编程能力。 综上所述,OpenGL超级宝典第七版的源码是OpenGL编程入门的良好资源,通过学习源码可以更好地理解OpenGL编程,提高OpenGL编程能力。 ### 回答3: OpenGL超级宝典第七版源码集合了OpenGL的基本概念、API和应用程序设计,以及各种实用技巧、优化策略和代码样例。源码主要包含了OpenGL的核心模块、常用工具和实践案例等内容。 通过学习OpenGL超级宝典第七版源码,可以深入了解OpenGL的原理和应用,掌握OpenGL编程的基本方法和技巧,从而提高OpenGL应用程序的开发效率和品质。 具体来说,OpenGL超级宝典第七版源码包括了如下内容: 1. OpenGL的基本概念和API:包括OpenGL的渲染管线、图形渲染的基本流程、OpenGL的渲染状态和矩阵变换等。 2. OpenGL的核心模块:包括OpenGL的渲染缓冲区、纹理、着色器和帧缓冲等核心模块的实现和应用。 3. OpenGL的常用工具:包括OpenGL的调试工具、性能分析工具和开发工具等。 4. OpenGL的实践案例:包括OpenGL的2D和3D图形绘制、游戏开发、虚拟现实和GPU计算等实践案例。 总之,OpenGL超级宝典第七版源码是OpenGL编程学习和开发的重要资源,为OpenGL初学者和开发者提供了丰富的参考资料和实践经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值