direct x 11智能地创建顶点缓冲区
direct x 11 creating vertex buffers intelligently
我遇到了一个难题,这个难题一直困扰着我。假设我有几个着色器,它们都有不同的顶点类型,如下所示:
// light shader
struct vertexInputType
{
float4 position : POSITION;
float2 tex : TEXCOORD0;
float3 normal : NORMAL;
};
// color shader
struct vertexInputType
{
float4 position : POSITION;
float4 color : COLOR;
};
// bump mapping shader
struct vertexInputType
{
float4 position : POSITION;
float2 tex : TEXCOORD0;
float3 normal : NORMAL;
float3 binormal : BINORMAL;
float3 tangent : TANGENT;
};
现在让我们假设我有一个模型,所有这些数据都可用。我不能完全把它放在同一个缓冲区中,并用我选择的所有3个进行渲染,因为数据并没有正确地为所有的3个进行布局。我只看到了两种选择,这两种选择都同样痛苦。
1) 我可以在ram中有一个保存所有数据的大缓冲区,然后每次draw调用,我都会从着色器对象中获取顶点类型,并使用正确的信息创建一个新的顶点缓冲区。正如你所看到的,这将是非常缓慢的。
或者。。。
2) 当模型初始化时,我可以创建多个ID3D11Buffers,其中一个缓冲区具有位置和颜色,一个具有位置、纹理和法线,一个有位置、纹理、法线、binormal和切线,以及模型具有信息的任何其他顶点类型所需的缓冲区。相比之下,这会抹杀你的可用vram,使其成为一个nogo。
我看不出有其他办法可以做到这一点。你们其他d3d是怎么做到的?
在DX11上下文中询问这一点是件好事-ID3D11InputLayout从以前的版本中大大简化了这个概念。您可以使用CreateInputLayout创建顶点数据的多个布局(上面提供的每个结构都有一个布局),并在希望对同一顶点缓冲区进行不同解释的点使用正确布局调用IASetInputLayout。
编辑:在此处查看创建输入布局对象的示例。
希望这能有所帮助!
诀窍是将数据分离为流:p、T、A.
流p包含位置和法线。使用照明渲染顶点需要这些数据。您还可以包括二进制规范和顶点颜色数据。
流T包含纹理信息,因此可以多达8个TU通道。应注意存储此流中编码的通道数量,以确保在GPU总线上复制空通道时不会浪费内存带宽。
流A包含动画信息、骨骼重量等。
根据渲染管道的体系结构,可以有更多或更少的通道。这里的技巧是使用FVF来动态定义数据布局。这种体系结构的一个优点是优化内存带宽使用。当需要多个渲染过程,但并非每个过程都需要所有数据时,这一点尤其重要。
- 如何循环打印顶点结构
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 创建异构顶点数据数组的可移植方法
- 无法从 cso 文件创建顶点着色器(从 fx 文件创建)
- 如何使用每个顶点的自定义信息创建CGAL约束的delaunay三角测量
- 如何从顶点/索引缓冲区创建 CGAL Nef_polyhedron_3
- D3D11 创建着色器:编码的顶点着色器大小与指定大小不匹配
- 在线性时间内使用邻接列表创建对顶点
- DirectX 9 裝置.在渲染时创建顶点和索引缓冲区.(2 个线程)
- 使用顶点阵列、四边形阵列来创建四边形网格
- C Boost ::如何从顶点描述符创建地图
- 在DX9上为顶点缓冲区创建结构
- direct x 11智能地创建顶点缓冲区
- DirectX - 使用顶点数组作为参数创建缓冲区
- 如何用集合顶点列表创建boost子图
- 创建顶点缓冲区错误