OPenGL--Transform feedback基础
简述
TransformFeedback是OpenGL管线中,顶点处理(如果有几何着色器,那么就在几何着色器后)之后,图元装配之前的一个步骤。它可以重新捕获即将装配为图元(点,线段,三角形)的顶点,然后将部分或全部属性传递到缓存对象上来。每当一个顶点传递到图元装配阶段时,将所有需要捕获的属性记录到一个或多个缓存对象上,用户程序可以回读这些缓存对象的内容。
根据这个特性,它和顶点着色器可以组合成一个小的渲染管线,而不用后续的光栅化处理,这样就能利用GPU强大的计算能力做一些通用的计算。当然,如果当前OpenGL版本在OpenGL4.3及以上的话,可以使用了计算着色器。
transform feedback对象
transform feedback状态封装在一个transform feedback对象中,这个状态中包括所有记录顶点数据的缓存对象等,transform feedback对象的创建和其他的缓存对象类似,首先要创建一个对象名称,然后绑定到OpenGL环境中。
1创建对象名
GLuint glGenTransformFeedbacks(GLenum target, GLuint *id); 返回值:返回Uniforms的缓冲索引 参 数:program 着色器程序ID uniformBlockName Uniforms块名 |
2绑定到OpenGL环境
GLuint glBindTransformFeedback(GLenum target, GLuint id); 返回值:返回Uniforms的缓冲索引 参 数:program 着色器程序ID uniformBlockName Uniforms块名 |
3删除对象
GLuint glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids); 返回值:返回Uniforms的缓冲索引 参 数:program 着色器程序ID uniformBlockName Uniforms块名 |
transform feedback缓存
transform feedback对象主要用于管理将顶点捕捉到缓存对象的相关状态,这个状态中包含了链接到transform feedback缓存绑定点的缓存对象,transform feedback对象必须和一个缓存对象链接才能输出数据,它本身是不存储输出数据的(与帧缓存对线和附加到它上的纹理缓存类似)。
如果想要将整个缓存绑定到transform feedback上,可以使用函数glBindBufferBase()。
voidglBindBufferBase(GLenum target, GLint index, GLuint buffer) 功 能:将缓存绑定到transform feedback上 返回值:void 参 数:target 绑定目标必须设为GL_TRANSFORM_FEEDBACK_BUFFER index 缓存绑定点索引 buffer 绑定的缓存对象 |
如果想要将缓存的部分绑定到transform feedback上,可以使用函数glBindBufferRange()。
void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) 功 能:将缓存绑定到transform feedback上 返回值:void 参 数:target 绑定目标必须设为GL_TRANSFORM_FEEDBACK_BUFFER index 缓存绑定点索引 buffer 绑定的缓存对象 offset 起始地址 size 绑定的缓存大小 |
transform feedback缓存初始化示例
//生成缓存对象
Gluint buffer;
glGenBuffers(1, &buffer);
//绑定到GL_TRANSFORM_FEEDBACK_BUFFER,创建缓存对象
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buffer);
//调用glBufferData并分配空间
glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, //目标
1024 * 1024, //分配空间
NULL, //数据为空
GL_DYNAMIC_COPY); //用途
//绑定到带有索引的缓存绑定点
glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, //目标
0, //索引为0
buffer, //缓存名称
0, //数据起始地址
512 * 1024); //缓存的前半部分
glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, //目标
0,//索引为0
buffer,//缓存名称
512 * 1024),//数据起始地址
512 * 1024);//缓存的前半部分
配置transform feedback变量
再transform feedback过程中顶点着色器可能会输出多个变量。与transform feedback对象所绑定的缓存需要记录那些变量,这些都需要在应用程序中设置,我们需要调用函数glTransformFeedbackVaryings()来设定。
void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar **varyings, GLenum bufferMode) 功 能:设置缓存记录的变量 返回值:void 参 数:program 着色器程序 count 变量的总数 varyings 变量名数组 bufferMode 捕获变量的模式,可以是分量模式(GL_SEPARATE_ATTRIBS) 或交叉模式(GL_INTERLEAVED_ATTRIBS) |
注意:函数glTransformFeedbackVaryings()所指定的变量,只有再一次链接的时候才会起效,换句话说,glTransformFeedbackVaryings()必须再着色器程序链接之前调用。
transform feedback变量设置的示例
//创建一个记录变量名称的数组
static const char *const vars[] =
{
"foo", "var", "vaz"
};
//调用函数glTransformFeedbackVaryings
glTransformFeedbackVaryings(program,
sizeof(vars)/sizeof(vars[0]),
vars,
GL_INTERLEAVED_ATTRIBS);
//现在(非常重要),需要链接程序对象
glLinkProgram(program);
transform feedback的启动和停止
transform feedback可以随时启动或停止,甚至暂停,如果启动transform feedback时,它并没有处于暂停的状态,它会重新开始将数据记录到当前绑定的ransform feedback缓存中,不过如果transform feedback正处于暂停的状态,那么再次启动它将会从之前暂停的位置开始记录。如果需要将厂家中的某些部分记录到transform feedback当中,这个特效是比较有用的。
启动
void glBeginTransformFeedback(GLenum primitiveMode);
暂停
void glPauseTransformFeedback(void);
如果当前的ransform feedback没有启用,或者处于暂停状态,
调用glPauseTransformFeedback会产生一个错误
重新启动
void glResumeTransformFeedback(void);
要重新启动一个暂停的ransform feedback,必须使用glResumeTransformFeedback。
如果使用glBeginTransformFeedback同样会产生一个错误。
停止
void glEndTransformFeedback(void);
如果已经完成了transform feedback图元的渲染,直接调用glEndTransformFeedback(),就可以重新切换到正常的渲染模式。
这章主要写了一些transform feedback的简要流程和API,不太容易理解和使用,可以参考下章
OPenGL--Transform feedback示例解析,有详细的示例。
参见:《OpenGL编程指南》第八版第5章
OPenGL--Transform feedback基础相关推荐
- OpenGL Transform Feedback转换反馈的实例
OpenGL Transform Feedback转换反馈 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include "vapp.h" ...
- OpenGL Transform Feedback
官网链接 使用TransFrom Feedback捕获图元数据,必须注意的几点: 必须在链接着色器之前设置要捕获的输出变量:glTransformFeedbackVaryings 顶点着色器.细分着色 ...
- OpenGL学习笔记 transform feedback缓存粒子系统示例分析
http://blog.csdn.net/coderling/article/details/44742077 transform feedback是OpenGL中比较酷炫的特性之一,他让客户端应用程 ...
- NDK OpenGL ES 3.0 开发(七):Transform Feedback
该原创文章首发于微信公众号:字节流动 什么是 Transform Feedback Transform Feedback(变换反馈)是在 OpenGLES3.0 渲染管线中,顶点处理阶段结束之后,图元 ...
- OpenGL ES之变换反馈Transform Feedback的使用流程
一.什么是 Transform Feedback ? Transform Feedback(变换反馈)是在 OpenGL ES 3.0 渲染管线中,顶点处理阶段结束之后,图元装配和光栅化之前的一个步骤 ...
- OpenGL Partical System by Transform Feedback
使用OpenGL的变换反馈(transform feedback)构造粒子系统 粒子系统是三维计算机图形学中用来模拟火,爆炸,雾,雪,流行尾迹或者发光轨迹等视觉效果的技术.粒子系统模拟这些现象的步奏简 ...
- OpenGL着色器基础
前言: 本文翻译自LearnOpengl经典教程,OpenGL着色器基础介绍的比较通俗易懂,特总结分享一下! 为什么要使用着色器? 我们知道,OpenGL一般使用经典的固定渲染管线来渲染对象,但是随着 ...
- OpenGL(三)——OpenGL着色器基础
上一篇我们介绍了OpenGL基础相关的知识:OpenGL图形绘制和OpenGL入门,今天介绍一下OpenGL另一重要的成员----OpenGL着色器. 什么是OpenGL着色器? Open GL ES ...
- transform的基础使用
目录 介绍 常用函数 rotate代码 skew代码 skewX代码 skewY代码 scanle代码 scaleX代码 scaleY代码 translate代码 translateX ...
最新文章
- UVALive5389 UVA414 POJ1493 ZOJ1339 Machined Surfaces
- 秒懂机器学习---朴素贝叶斯
- SQL2005的安装
- 【论文投稿】计算机学科部分核心期刊投稿攻略
- 二级Python 第三方库
- C++ qsort() 函数调用时实参与形参不兼容的问题解决
- qq群 voiceover_如何在iOS上使用VoiceOver为所有人构建应用程序
- vmware传东西到linux后文件变小,在VMWARE的Linux虚拟机上删除大容量文件后硬盘空间大小还不变怎么办?虚拟机虚拟机的各种应用及问题...
- redux,react-redux之间的关系
- js中的字符串方法与数组方法总结
- Atitit it 互联网 软件牛人的博客列表
- 分布式——分布式面试题
- [乐意黎原创]联想G470老笔记本升级改造
- 4399IT运维实习生面试经历
- 【Python量化】使用机器学习预测股票交易信号
- 【Nand2tetris】Project02
- Calendar加減月份、年份-月底的处理逻辑
- 解决 command not found: brew :Mac安装Brew
- GMSL部分问题解答/含官方FAE解答
- Cortex-M3处理器的舞台