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)的更多相关文章

  1. OpenGL编程指南(第七版)

    OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...

  2. 编译opengl编程指南第八版示例代码通过

    最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...

  3. VS15 openGL 编程指南 配置库 triangle例子

    最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去 ...

  4. [转]OpenGL编程指南(第9版)环境搭建--使用VS2017

    1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...

  5. opengl编程指南

    第一章 opengl简单介绍 1.1 什么是opengl opengl是图形硬件的一种软件接口.        1>渲染(rendering)是计算机依据模型创建图像的过程. 2>模型(m ...

  6. OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)

    1. 先上代码 头文件glCommon.h #include <GL/glew.h> #include <GL/GL.h> #include <GL/GLU.h> ...

  7. OpenGl编程指南第7版(红宝书)环境配制

    环境 OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 软件 glut. 在这个页面https://www.opengl.org/resources/librar ...

  8. OpenGL编程指南(第九版) Tiangles 学习笔记

    ////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp / ...

  9. 《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法

    解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut. ...

  10. Opengl编程指南第二章:状态管理、几何绘图

    //http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0 ...

随机推荐

  1. Oracle修改用户Profile SESSIONS_PER_USER 限制

    一.Profile目的: Oracle系统中的profile可以用来对用户所能使用的数据库资源进行限制,使用Create Profile命令创建一个Profile,用它来实现对数据库资源的限制使用,如 ...

  2. 面试想拿 10K,HR 说你只值 7K,该怎样回答或者反驳?

    当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫. 礼貌地说:"7K是吗?了解了.嗯~其实我对贵司的面试官印象很好.只不过,现在我的手头上已经有一份11K的offer. ...

  3. ArchLinux下electronssr无法启动的解决措施

    ArchLinux下electronssr无法启动的解决措施 今天重新配置electron-ssr时发现闪退(无法启动). 于是开始查错 首先是找到了目录位置 /usr/electron-ssr/el ...

  4. 剑指offer-面试题53_3-数组中数值和下标相等的元素-二分查找

    /* 题目: 求单调递增数组中,数值与下标相等的任意数字. */ /* 思路: 二分法. */ #include<iostream> #include<cstring> #in ...

  5. VSCode常用插件之ESLint使用

    更多VSCode插件使用请访问:VSCode常用插件汇总 ESLint这是VS Code ESLint扩展,将ESLint JavaScript集成到VS Code中. 首先简单说一下使用流程: 1. ...

  6. 使用shell程序备份crontab中的.sh脚本文件

    需求 线上环境有一些定时脚本(用crontab -l可查看当前用户的),有时我们可能会改这些定时任务的脚本内容.为避免改错无后悔药,需用shell实现一个程序,定时备份crontab中的.sh脚本文件 ...

  7. TChart-数据编辑(TChartListBox,TeeCommander)

    先上图 功能代码: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Contr ...

  8. C++->输入输出文件流的相关函数

    标准输入输出流与文件输入输出流的关系图: 文件输出流头文件“ofstream/fstream”,文件输入流头文件“ifstream/fstream” 1.1.打开文件方式:流类 对象名(文件名,方式) ...

  9. ADB之安装APK

    一.下载安装adb工具 下载安装,cmd测试是否成功 二.连接设备 1.手机打开USB测试 2.测试连接 三.安装应用 adb -s [设备编号] install [apk的完整路径]  

  10. Java(四)输出和输入函数

    介绍一下Java里简单常用的输入输出方法. Java的输出函数很简单,直接调用System类的out对象的print函数即可. 代码: System.out.print(a);//输出变量a的值 Sy ...