本篇在讲什么 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
♠ 结语
若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。