跨平台渲染框架尝试 - GPU Buffer的管理(1)
buffer资源
下面来谈谈buffer的管理。buffer资源从广义上就是C语言的数组。如下图所示。

图 buffer的广义模型
在渲染管线中,无论是opengl还是dx或者其他的渲染api,都会提供下列的buffer类型。vertex buffer,index buffer,constant buffer,structured buffer,raw buffer与indirect arguments buffer. 这些buffer的不同就在于两个方面。
首先就是内存结构。有流式的buffer,如vertex buffer和index buffer,它们的行为更像是数据流,数据的读取时顺序的,因此内存的分布式紧密和连续的。而structured buffer,constatn buffer等是结构式的buffer,为了满足GPU中高效的随机访问buffer数据的需求,这些buffer通常会按照一定的规则进行内存对齐。
其次,在上面已经提到,就是访问方式的不同。正式因为访问方式的不同,才有了内存结构的不同。流式数据往往数据量很大(数万个定点,数十万个索引的高模),只提供顺序访问,并且访问的工作已经由shader中不同的stage辅助处理了。而结构式的buffer往往shader程序中的数据量没有流式数据那么绝大,但更多的是高效与方便的随机访问buffer数据,他们在shader程序中都有类似operator[](constant buffer),还有类似栈的行为(append & consume buffer).
对buffer资源的管理基本遵循两个关键点。1. 一个元素的大小与元素的个数 2. 如何方便应用程序在cpu端初始化和访问buffer的数据。第一决定整个buffer的大小,第二个是buffer在应用程序段操作数据的接口。
后面的篇幅会依次对这些buffer资源进行详细讨论,buffer的管理较texture而言较为复杂,我们先从vertex buffer和index buffer开始。前面说过,vertex buffer和index buffer是流式数据。一般情况下,它们的数据保存在模型文件中,程序载入这些数据,创建vb和ib作为应用程序的输入。vertex buffer除了作为输入之外,还可以作为geometry shader的输出。
vertex buffer

图 vertex buffer
我们借用d3d api中input layout的概念来管理vb中单位元素的大小。vb的一个单位元素,都是由若干个基本的一维向量类型的属性(attribute)依次排开,而组成。
Input layout由
1. 描述每个属性的类型;
enum class data_format
{
float_,
float2,
// ...........
float4x4,
int_,
// .......
uint4,
structured,
};
2. 描述每个属性相对于元素内存起始位置的偏移量
3. 描述每个属性的语义(在d3d中有用)
enum class data_semantic
{
position,
normal,
binormal,
tangent,
texcoord0,
texcoord1,
// .......
texcoord7,
color0,
color1,
};
这样,input layout就能够完整的计算出vb单位元素的大小,并辅助在应用程序段对vb初始化和访问数据的工作。
在leaves::pipeline::buffer的实现宏, 除了buffer<vertex_buffer>基类提供的ptr_as<T>()模板成员函数方便直接的内存拷贝之外,我们管理的vb还提供类似stl访问容器的迭代器,分语义来访问vb中的元素。
index buffer

图 index buffer
index buffer的管理较vb稍简单一些。单位元素就是一个整形。因此它的迭代器也轻量一些,直接使用指针。但是index buffer还需要管理一个primitive type。它描述的是定点索引之间的拓扑关系。如图。

图 基本的拓扑结构

图 line_list_adj 和 line_strip_adj

图 triangle_list_adj

图 triangle_strip_adj
不同拓扑关系会影响index buffer元素个数,可以根据上面几张图的关系来实现一个由primitive数量计算indices数量的函数。
下一篇将详细介绍constant buffer及剩下buffer的管理。
详细的实现代码托管在 https://github.com/IndignantAngel/modern-graphics-framework 中,欢迎大神前来指教。
跨平台渲染框架尝试 - GPU Buffer的管理(1)的更多相关文章
- 跨平台渲染框架尝试 - constant buffer的管理
		
1. Preface Constant buffer是我们在编写shader的时候,打交道最多的一种buffer resource了.constant表明了constant buffer中的数据,在一 ...
 - 跨平台渲染框架尝试 - Texture管理
		
纹理是渲染器重要的资源,也是比较简单的资源.本文将详细讨论纹理资源的管理. 在资源管理概述中提到,资源就是一堆内存和CPU与GPU的访问权限.纹理管理在资源管理之上,要负责如何使用者一堆内存构造纹理对 ...
 - 在现代渲染API下,封装跨平台渲染框架的尝试 - 资源管理
		
小生资历浅薄,不讨论该主题的重要性与未来的意义,只是个人兴趣爱好平日对这个问题思考了很多,总觉得要写点东西记录下来.框架还没有定型,只是记录自己设计的过程. 系统要跨平台,首先得将平台相关的实现与平台 ...
 - 【Cocos2d-X开发学习笔记】第03期:渲染框架之导演类(CCDirector)的使用
		
本系列学习教程使用的是cocos2d-x-2.1.4版本(截至目前为止最新稳定版) ,PC开发环境Windows7,C++开发环境VS2010 提到“导演”一词,想必读者最先联想到的是电影.作为娱乐产 ...
 - 【Cocos2d-X开发学习笔记】第05期:渲染框架之布景层类(CCLayer)的使用
		
本系列学习教程使用的是cocos2d-x-2.1.4版本(截至目前为止最新稳定版) ,PC开发环境Windows7,C++开发环境VS2010 图层也是渲染框架中很重要的内容.场景类用来划分游戏的状态 ...
 - .NET 跨平台界面框架和为什么你首先要考虑再三
		
原文地址 现在用 C# 来开发跨平台应用已经有很成熟的方案,即共用非界面代码,而每个操作系统搭配特定的用户界面代码.这个方案的好处是可以直接使用操作系统原生的控件和第三方控件,还能够和操作系统 ...
 - 【译】.NET 跨平台界面框架和为什么你首先要考虑再三
		
现在用 C# 来开发跨平台应用已经有很成熟的方案,即共用非界面代码,而每个操作系统搭配特定的用户界面代码.这个方案的好处是可以直接使用操作系统原生的控件和第三方控件,还能够和操作系统深度集成. 这里的 ...
 - .NET 跨平台RPC框架DotNettyRPC
		
DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standard2.0 2.产生背景 传统.NET开发中遇到远程调用 ...
 - .NET 跨平台RPC框架DotNettyRPC   Web后台快速开发框架(.NET Core)   EasyWcf------无需配置,无需引用,动态绑定,轻松使用  C# .NET 0配置使用Wcf(半成品)   C# .NET Socket 简单实用框架  C# .NET 0命令行安装Windows服务程序
		
.NET 跨平台RPC框架DotNettyRPC DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...
 
随机推荐
- mysql update语句,修改字段,,或者是批量修改字段
			
更新一个字段,在它的后面加一个字符串,不查询数据库得到这个字段值 怎么添加?? 例如: 我的test表,有个user字段,我现在想在它后面加了另一个用户的名字 我在mysql数据库这样写 UPDATE ...
 - Win7中,取消共享文件夹后有个小锁
			
用过windows7的朋友都知道,Windows 7 中设置某一个文件夹属性为共享后,文件夹的图标上就增加一个小锁图案.起到了一个标记作用,挺好的.但是即使你将该文件夹的共享功能取消后,该小锁图案还是 ...
 - eclipse添加xsd
			
图片参考 http://wenku.baidu.com/link?url=DFHWF_yD-M-GCt2tfjs1npPs1xhNlyxik7i_pCBjw3oVlbssYrMvLNucuUpKg75 ...
 - js判断是手机访问还是电脑访问
			
<script type="text/javascript"> <!-- //平台.设备和操作系统 var syste ...
 - 当list中有中文,打印的时候显示为字符编码的问题
			
当list中有中文时,print list显示的会是字符编码,比如: 用str()当然也不行: 在不安装其他包的情况下,目前我知道的解决办法是使用decode('string_escape'),如下:
 - nginx网站架构优化思路(原)
			
本人接触的优化主要分为三大类 黑体的为本模块下的重点 ---------------安全优化 安全在生产场景中是第一位的 1.1 站点目录权限的优化 (修改权限755 644 所属用户root,需要 ...
 - CloudStack添加新的API注意事项
			
1.***Cmd上面的@APICommand里的responseObject关联对于的Response: 2.在tomcatconf/command.properties.in添加新API的权限: 3 ...
 - Ubuntu 14.04远程登录服务器--openssh的安装和配置简明步骤
			
如果要主机通过网络操作嵌入式板子,ttelnet就够了,但是 如果要相互传文件,则必须使用另外一个强大的软件SSH.更完整的步骤和截图请参考http://jingyan.baidu.com/artic ...
 - logstash 防止实际处理时间跟事件产生时间略有偏差
			
"message" => " 10.168.255.134 [12/Sep/2016:16:30:40 +0800] \"GET /resources/p ...
 - 使用URL创建网络连接、网络流的阻塞问题
			
在读取网络中流数据时,通常要创建一个网络连接.然而在创建URL连接时,我们通常会忽略掉设置ConnectTimeout,以及ReadTimeout: URL url = new URL(urlstr) ...