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 ...
随机推荐
- vue-cli-service 报错
错误内容: vue-cli-service serve /bin/sh: vue-cli-service: command not found error Command failed with ex ...
- node的httpserver简单创建
1.设计原则为文件夹名字可以依据资源来命名,静态资源统一命名 ps:路径中绝对和相对路径,依据server.js本身的位置而言 const http = require("http" ...
- cra
const paths = require('react-scripts/config/paths'); paths.appBuild = path.join(path.dirname(paths.a ...
- MySQL 8 在一台机器上运行多个MySQL实例
可以为每个实例使用一个MySQL Server二进制程序,也可以为不同实例使用同一个MySQL Server二进制程序. 不管哪一种选择,部分参数可能需要不同配置,以避免多个实例之间的冲突. 可能需要 ...
- .net core 3.0 swagger
1.安装swagger包 2.startup里configservers Configure 3.可能出现的错误 提示error xxxxnot found 由于我创建的webapi是restful ...
- Dictionary的基本用法
1.创建泛型哈希表,然后加入元素 Dictionary<string,string> openWith=new Dictionary<string, string>(); op ...
- 第十届蓝桥杯CB题目I-分析
思路分析://感谢写文博主 思路:相信大多数人和我一样在比赛的时候把这题想的太简单了_(:з」∠)_ 这题和去年的最后一题很类似,就是分类讨论,去年放在了最后一题,今年在倒数第二题,说明难度不算太难, ...
- java静态初始化块的执行顺序
先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...
- linux 文件系统管理三部曲之一:磁盘分区
硬盘和主板的连接的地方:叫接口,硬盘的接口类型: iops:i/o per second:每秒的读写次数. IDE(ata):并口(数据并行传输),理论最大传输 133MB/S:iops:100次 S ...
- 跨站请求伪造(Cross-site request forgery), 简称为 XSRF
跨站请求伪造(Cross-site request forgery), 简称为 XSRF,是 Web 应用中常见的一个安全问题.前面的链接也详细讲述了 XSRF 攻击的实现方式. 当前防范 XSRF ...