OpenGL 编程指南 (4)
1、OpenGL用户裁剪需要使用一个vertex shader的内置变量gl_ClipDistance,它是一个声明的时没有指定大小的数组,因此需要重新声明它的大小或者将它作为一个编译时的常量使用(啥意思???)。
gl_ClipDistance每一个元素对应一个平面,平面数目有限通常为8个,可以通过gl_MaxClipDistances获取平台支持的最大值。这个数组大小包括了已经启用的其它裁剪面,vertex shader必须写入所有已经启用裁剪面的距离,否则表现不可预测,通过裁剪的片元可以读取裁剪面插值后的结果。
2、transform feedback 是顶点处理结束之后,图元装配和光栅化之前的步骤,它能够重获获取顶点数据后选择性地部分或全部传递到缓冲对象中。
void glGenTransformFeedbacks(GLsizei n, GLuint* ids)
void glBindTransformFeedback(GLenum target, GLuint id)//target 必须是 GL_TRANSFORM_FEEDBACK
系统有一个默认的transform feedback对象,id为0。可以同时给transform feedback对象绑定多个缓冲,也可以绑定缓冲对象的多个子块,甚至可以将统一个缓冲对象的不同子块同时绑定到不用的transform feedback缓冲绑定点上,也能够只是绑定一部分。
void glBindBufferBase(GLenum target, GLuint index, GLuint buffer)//target 必须是 GL_TRANSFORM_FEEDBACK_BUFFER,index应小于GL_MAX_TRANSFORM_FEEDBACK_BUFFERS(最小64)
void glBindBufferRange(Glenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
分配空间后需要告诉它目标数据,这些数据来自vertex shader 或者 geometry shader的输出
void glTransformFeedbackVaryings(Gluint program, GLsizei count, const GLchar** varyings, GLenum bufferMode)//bufferMode获取变量的模式,有分离模式(GL_SEPARATE_ATTRIBS,每个变量输出到一个单独的缓冲对象中)与交叉模式(GL_INTERLEAVED_ATTRIBS,所有变量一个接一个地记录到第一个绑定对象中)
static const char* const vars[] = {"first", "second", "third"};
glTransformFeedbackVaryings(program, sizeof(vars)/sizeof(vars[0]), vars, GL_SEPARATE_ATTRIBS);
glTransformFeedbackVaryings(program, sizeof(vars)/sizeof(vars[0]), vars, GL_INTERVLEAVED_ATTRIBS);
glLinkProgram(program);//设置了这些东西需要重新链接着色器程序使其生效,不进行这一步不会产生错误但是此次设置transform feedback信息不会生效
交叉模式(左)与分离模式(右)下的内存数据结构如下:


有没有觉得这种数据获取方式就像个憨憨,当获取模式为GL_INTERLEAVED_ATTRIBS时,可以在连续存储的变量间保留空隙或者在不同的buffer中来回跳动。shader的内置变量gl_SkipComponents1......gl_SkipComponents4 与 gl_NextBuffer能够实现这些需求。当时需要注意的是,跳过的分量(空隙)依然被记入获取数据量的总数,也需要适当的使用动静分离。
static const char* const vars[] =
{
"foo",//从绑定点0开始写入数据
"gl_SkipCompents1",//一个浮点数空隙
"bar",
"gl_SkipCompents2",//两个浮点数空隙
"gl_NextBuffer",//移动到下一个绑定点1
"gl_SkipCompents4",
"baz",
"gl_SkipCompents2",
"gl_NextBuffer",
"gl_NextBuffer",//移动到了绑定点3
"iron",
"gl_SkipCompents3",
"copper"
};
glTransformFeedbackVaryings(program, sizeof(vars)/sizeof(vars[0]), vars, GL_INTERLEAVED_ATTRIBS);
glLinkProgram(program);

3、transform feedback 的启用与停止
void glBeginTransformFeedback(GLenum primitiveMode)//参数必须是GL_POINTS、GL_LINES、GL_TRIANGLES中一种,要记录的绘制内容绘制图元需要一样活着geometry shader的输出图元与之一样
void glPauseTransformFeedback()
void glResumeTransformFeedback()//恢复记录是数据的填充会从停止的地方开始
void glEndTransformFeedback()
OpenGL 编程指南 (4)的更多相关文章
- OpenGL编程指南(第七版)
OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...
- 编译opengl编程指南第八版示例代码通过
最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...
- VS15 openGL 编程指南 配置库 triangle例子
最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去 ...
- [转]OpenGL编程指南(第9版)环境搭建--使用VS2017
1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...
- opengl编程指南
第一章 opengl简单介绍 1.1 什么是opengl opengl是图形硬件的一种软件接口. 1>渲染(rendering)是计算机依据模型创建图像的过程. 2>模型(m ...
- OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)
1. 先上代码 头文件glCommon.h #include <GL/glew.h> #include <GL/GL.h> #include <GL/GLU.h> ...
- OpenGl编程指南第7版(红宝书)环境配制
环境 OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 软件 glut. 在这个页面https://www.opengl.org/resources/librar ...
- OpenGL编程指南(第九版) Tiangles 学习笔记
////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp / ...
- 《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法
解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut. ...
- Opengl编程指南第二章:状态管理、几何绘图
//http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0 ...
随机推荐
- 00-django | 02-处理HTTP请求
00-django | 02-处理HTTP请求 python Django Django 处理 HTTP 请求 Hello 视图函数 我们先以一个最简单的 Hello World 为例来看看 djan ...
- 记录zabbix4.0升级4.2
系统环境 [root@localhost ~]# cat /etc/redhat-release CentOS release 6.9 (Final) 官方网站 官方文档升级其实很简单如果 ...
- mybatis_day02
2.映射器Mapper 相当于dao层,不用写实现类(mybatis底层会采用动态代理模式 会跟我生成实现) 步骤: (1) 创建项目 配置mybatis-config.xml 和昨天一样 (2) 创 ...
- 数据结构(集合)学习之List
集合 框架关系图: Collection接口下面有三个子接口:List.Set.Queue.此篇是关于List<E>的简单学习总结. 补充:HashTable父类是Dictionary,不 ...
- linux中安装nginx时查看修改80端口时没有iptables文件的内容?? 求解
- 一.pycharm配置Pyqt开发环境
1.安装pyqt pip install PyQt5 pip install PyQt5-tools 2.配置pycharm 2.1 配置QtDesigner Qt Designer 就是一个前端界面 ...
- HTML5表单验证(4个实用的表单美化案例)
multipart/form-data 在使用包含文件上传控件的表单时,必须使用autocomplete="on" 自动补全功能novalidate 不验证 <form en ...
- CF1254E Send Tree to Charlie
题意 讲不太清楚,看英文吧 cf 做法 在正式开始之前,我们先来玩一玩性质 首先考虑全\(0\)的情况,即本质不同的方案数 性质1:方案数并不为(n-1)!,即方案与结果不为双射 考虑一条边将树分为两 ...
- 在Windows启动pyspark shell:Failed to find Spark jars directory. You need to build Spark before running this program
D:\Develop tools\spark-2.2.0-bin-hadoop2.7\bin>pyspark2.cmd 'tools\spark-2.2.0-bin-hadoop2.7\bin\ ...
- HashMap的一些学习
1.equals和==的对比==用于比较引用和比较基本数据类型时具有不同的功能:A:比较基本数据类型,如果两个值相同,则结果为true而在比较引用时,如果引用指向内存中的同一对象,结果为true; e ...