跨平台渲染框架尝试 - 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 中,欢迎大神前来指教。

时间: 2024-10-08 07:56:34

跨平台渲染框架尝试 - GPU Buffer的管理(1)的相关文章

跨平台渲染框架尝试 - constant buffer的管理

1. Preface Constant buffer是我们在编写shader的时候,打交道最多的一种buffer resource了.constant表明了constant buffer中的数据,在一次draw call的执行过程中都是不变的:而在不同的draw call之间,我们可以修改其中的数据.它是我们把数据从CPU传递到GPU最常见的方法.constant buffer的概念和定义就不在这里赘述了,鄙文主要讨论如何优雅的管理constant buffer. 2. How to creat

跨平台渲染框架尝试 - Texture管理

纹理是渲染器重要的资源,也是比较简单的资源.本文将详细讨论纹理资源的管理. 在资源管理概述中提到,资源就是一堆内存和CPU与GPU的访问权限.纹理管理在资源管理之上,要负责如何使用者一堆内存构造纹理对象,并告诉渲染器如何使用平台相关的纹理对象.下面,我们开始详细论述. 1. 纹理资源 首先纹理资源是GPU可以使用到的资源.它与Buffer资源不同的地方在于,相邻像素的插值计算中,纹理比Buffer简单并快得多,因为有相应的硬件实现.纹理资源字面意义上就像是一张像素图,但它不仅限于二维的像素的图,

跨平台UI框架杂思——02

距离本系列最后一篇随笔<跨平台UI框架杂思--01>的发表已经过去了一年多.这一年多我都没怎么在外头写blog了(写东西都放在公司的 confluence page 里).这一年多我的"跨平台UI框架"实现了,并且用到了公司的产品中.我很欣慰地发现这一年多来,我都是按照最后一篇随笔的思路来开展的-- 硬件加速渲染 高可扩展性 灵活可替换的渲染框架 在Windows上面做透了 首先实现了 Direct2D 的渲染 由于这个框架是我在公司写的,所以目前暂且没能对外开源. 框架的

.NET 跨平台界面框架和为什么你首先要考虑再三

???原文地址 现在用 C# 来开发?跨平台应用已经有很成熟的方案,即共用非界面代码,而每个操作系统搭配特定的用户界面代码.这个方案的好处是可以直接使用操作系统原生的控件和第三方控件,还能够和操作系统深度集成. 这里的深度集成主要是指一些 Windows 专有的系统特性: Windows 托盘 Windows 跳转列表 Windows 系统主题 也包括一些移动平台的特性,例如 iOS 的原生滑动. ?由于操作系统上其他程序一般都使用原生控件,于是只有当你的程序采用同样技术时,它才能很好地保持一致

JobEngine 基于quartz.net 跨平台作业框架

github:https://github.com/zzhi/JobEngine 基于quartz.net 的跨平台作业框架 quartz.net(https://github.com/quartznet/quartznet/tree/features/netcore11) 也支持跨平台了 ,由于NuGet无法安装quartz-DotNetCore dll. 所以我直接把这个解决方案下载下来,删除一些无用的代码,在解决方案上直接创建项目JobServer, 通过添加引用的方式引用quartz-D

Ext js框架模拟Windows桌面菜单管理模板

一款超炫的后台,Ext模拟Windows桌面,Ext经典浅蓝风格,功能非常强大,包括最大化.最小化.状态栏.桌面图标等,不过需要非常懂Ext脚本的才可驾驭它.? 1.图片 ?2. [代码][HTML]代码  <html><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><title>Ext 2.0 Desktop

游戏UI框架设计(四) : 模态窗体管理

游戏UI框架设计(四) --模态窗体管理 我们在开发UI窗体时,对于"弹出窗体"往往因为需要玩家优先处理弹出小窗体,则要求玩家不能(无法)点击"父窗体",这种窗体就是典型的"模态窗体".在此笔者设计了四种模式类型:完全透明.半透明.低透明度.透明且可以穿透. (透明不能穿透) (半透明不能穿透) (低透明度,不能穿透) 对于"模态窗体"的基本实现原理是: 在弹出窗体的后面增加一层"UI遮罩窗体",当需要弹出

文献综述十八:基于SSH框架的进销存管理系统设计与实现

一.基本信息 标题:基于SSH框架的进销存管理系统设计与实现 时间:2017 出版源:内蒙古科技与经济 文件分类:对框架的研究 二.研究背景 进销存管理系统在各企业中广泛应用,使用SSH框架,很大程度上提高了开发效率及系统的可靠性和易用性. 三.具体内容 文献的主要内容分为三大部分.一是SSH框架技术,二是系统功能模块,三是系统实现相关技术介绍. SSH框架技术:分为struts2框架.spring框架.hibernate框架.struts2框架:采用拦截器机制来处理用户的请求,这样使得业务逻辑

微软跨平台ORM框架之EFCore

EFCore是微软推出的跨平台ORM框架,想较于EF6.X版本,更加轻量级.EFCore目前已经更新到2.x. 接下来用CodeFirst的方式来使用EFCore. 1.创建控制台程序 2.引入EFCore的Nuget包和Sqlserver的扩展(因为我这里用的Sqlserver数据库,若是别的数据库如Mysql引入相应的包即可). 3.创建继承成自DbContext上下文,并重载OnConfiguring方法来构建数据库连接字符串 public class CoreDbContext : Db