在 DX10/DX11 中使用多个顶点缓冲区

2023-11-24

我有一个我一直在编写的 C++ DirectX 11 渲染器。

我编写了一个 COLLADA 1.4.1 加载程序来导入 COLLADA 数据以用于支持骨骼动画。

我此时正在验证加载程序(并且我之前在我之前使用不同技术编写的另一个渲染器中支持过 COLLADA),并且我遇到了将 COLLADA 与 DX10/11 匹配的问题。

我有 3 个独立的顶点数据缓冲区:

唯一顶点位置的顶点缓冲区。 唯一法线的顶点缓冲区。 唯一纹理坐标的顶点缓冲区。

这些顶点缓冲区包含不同的数组长度(位置有 2910 个元素,法线有超过 9000 个元素,纹理坐标大约有 3200 个元素。)

COLLADA 提供了一个三角形列表,它为我提供了给定三角形的每个数组的索引(一开始很冗长且奇怪,但一旦使用它,最终它就会变得简单。)

知道 DX10/11 支持多个顶点缓冲区后,我想我应该用每个缓冲区的索引填充 DX10/11 索引缓冲区* and *(这是重要的部分),对于三角形的给定点,这些索引可能不同。

换句话说,我可以设置三个顶点缓冲区,设置正确的输入布局,然后在索引缓冲区中放置相当于:

l_aIndexBuffer[ NumberOfTriangles * 3 ]

for( i = 0; i < NumberOfTriangles; i++ )
{
    l_aIndexBufferData.add( triangle[i].Point1.PositionIndex )
    l_aIndexBufferData.add( triangle[i].Point1.NormalIndex )
    l_aIndexBufferData.add( triangle[i].Point1.TextureCoordinateIndex )
}

有关在 DirectX 中使用多个顶点缓冲区的文档似乎没有提供任何有关这如何影响索引缓冲区的信息(稍后会详细介绍。)

以这种方式运行代码会产生奇怪的渲染结果,我可以看到我间歇性地正确绘制的网格(奇怪的多边形,但大约三分之一的点位于正确的位置 - 提示 - 提示)

我认为此时(昨天)我已经搞砸了我的数据或指数,所以我煞费苦心地验证了这一切,所以我认为我搞砸了我的输入或其他东西。我通过使用法线和纹理缓冲区中的值来替代设置像素着色器使用的颜色值来消除此问题,颜色是正确的,因此我没有遇到填充问题。

最终我得出的结论是 DX10/11 必须期望以不同方式排序的数据,因此我尝试以这种方式存储索引:

indices.add( Point1Position index )
indices.add( Point2Position index )
indices.add( Point3Position index )
indices.add( Point1Normal index )
indices.add( Point2Normal index )
indices.add( Point3Normal index )
indices.add( Point1TexCoord index )
indices.add( Point2TexCoord index )
indices.add( Point3TexCoord index )

奇怪的是,这产生了一个看起来 1/3 正确的渲染网格 - 提示 - 提示。

然后我推测 DX10/DX11 可能希望索引“通过顶点缓冲区”存储,这意味着我将首先添加所有三角形的所有位置索引,然后添加所有三角形的所有法线索引,然后添加所有三角形的所有纹理坐标索引三角形。

这产生了另一个 1/3 正确(看起来)的网格。

这让我想到 - 好吧,DX10/11 肯定不会为您提供从多个顶点缓冲区流式传输的能力,然后实际上期望每个三角形点只有一个索引?

仅将索引包含到位置的顶点缓冲区中才能生成正确渲染的网格,但不幸的是使用了错误的法线和纹理坐标。

看来将法线和纹理坐标索引放入索引缓冲区会导致在正确渲染的网格上进行错误绘制。

这是预期的行为吗?

多个顶点缓冲区 - 一个索引缓冲区并且索引缓冲区对于三角形的一个点只能有一个索引?

这对我来说真的没有意义。

Help!


我脑海中浮现的第一件事是:

所有支持计算着色器的硬件(相当于几乎所有 DirectX 10 及更高版本)也支持字节地址缓冲区s并且大部分都支持结构化缓冲区s。所以你可以将你的数组绑定为SRVs 并可以随机访问着色器中的任何元素。

像这样的东西(未经测试,只是伪代码):

// Indices passed as vertex buffer to shader
// Think of them as of "references" to real data
struct VS_INPUT
{
    uint posidx;
    uint noridx;
    uint texidx;
}

// The real vertex data 
// You pass it as structured buffers (similar to textures)
StructuredBuffer<float3> pos : register (t0);
StructuredBuffer<float3> nor : register (t1);
StructuredBuffer<float2> tex : register (t2);


VS_OUTPUT main(VS_INPUT indices)
{
    // in shader you read data for current vertex
    float3 pos = pos[indices.posidx];
    float3 nor = nor[indices.noridx];
    float2 tex = tex[indices.texidx];

    // here you do something
}

我们称之为“计算着色器方法”。您必须使用 DirectX 11 API。

您还可以以相同的方式绑定索引并在着色器中执行一些魔法。在这种情况下,您需要找出当前索引 id。也许您可以从 SV_VertexId 获取它。

也许您可以解决这些缓冲区并以其他方式绑定数据(DirectX 9 兼容纹理采样!O_o)。

希望能帮助到你!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 DX10/DX11 中使用多个顶点缓冲区 的相关文章

  • 如何在戈多中使刚体跳跃而不赋予其飞行能力

    我本来会使用运动体 但我想将现实生活中的物理添加到我的 2d 对象中 但似乎我可以通过多次按向上键来飞行 extends RigidBody2D var velocity Vector2 ZERO const GRAVITY 35 cons
  • Directx 11,将多个纹理发送到着色器

    使用此代码我可以将一个纹理发送到着色器 devcon gt PSSetShaderResources 0 1 pTexture 当然 我通过以下方式制作了 pTexture D3DX11CreateShaderResourceViewFro
  • C++ 中的简单事件系统

    我正在为我的游戏引擎设计一个简单的事件系统 我想实现以下事件调度程序接口 Create event dispatcher Dispatcher dispatcher Create objects b and c Created object
  • 从四元数查看矩阵

    我目前正在构建自己的四元数相机 据我所知 您只需要一个四元数即可完全指定相机的方向 如果我错了 请纠正我 那么 我将如何创建视图矩阵 顺便说一下 我使用 C 作为编程语言 任何帮助 将不胜感激 首先是一些注意事项 您会在网络上和有关该主题的
  • Java 中 DirectX 程序的全屏捕获(Javacv?)

    对于Windows 我知道可以捕获在 C 语言下运行的 DirectX 程序的屏幕 但是您知道 Java 的一些示例代码吗 我实际上面临着同样的问题使用java在全屏应用程序中截取屏幕截图 https stackoverflow com q
  • opengl 中的顶点缓冲区

    我正在制作一个小型 3D 图形游戏 演示以供个人学习 我了解 d3d9 和很多关于 d3d11 的知识 但目前对 opengl 知之甚少 所以我打算抽象出图形的实际渲染 以便我的场景图和 上面 的所有内容都不需要了解如何实际绘制图形 我打算
  • 从注入的 DLL 中挂钩 DirectX EndScene

    我想绕道EndScene从任意 DirectX 9 应用程序创建一个小的覆盖层 例如 您可以使用 FRAPS 的帧计数器叠加层 该叠加层在激活时会显示在游戏中 我知道以下方法可以做到这一点 创建一个新的d3d9 dll 然后将其复制到游戏路
  • 在 Windows 7 上使用 XAudio2 进行构建

    我正在尝试使用以下说明来构建一些使用 XAudio2 并在 Windows 7 上运行的代码 http msdn microsoft com en us library windows desktop ee663275 28v vs 85
  • 生成球体的顶点

    在 DirectX 移动照明示例中 圆柱体是按以下方式生成的 for DWORD i 0 i lt 50 i FLOAT theta 2 D3DMX PI i 50 1 pVertices 2 i 0 position D3DMXVECTO
  • 如何使用 Direct2D 高效地将像素写入屏幕

    我有一个像素数组 m pixels 我想使用 Direct2D 将其渲染到屏幕上 该数组包含 10 000 个元素 100 行 每行 100 个像素 下面的代码循环遍历像素并将它们作为 10x10 矩形绘制到屏幕上 有没有更有效的方法来执行
  • 在 DirectX 中创建和使用纹理

    我正在尝试使用代码创建纹理 将其转换为着色器资源视图 然后将其应用到平面 但是我得到的只是一个黑色方块 我尝试使用 msdn 上的示例代码无济于事 还尝试使用 unsigned char 和 float float 如下所示 因为这就是我需
  • AABB 碰撞解决滑动边

    因此 我目前正在重新发明轮子 并学到很多东西 尝试为我的游戏引擎制作一个简单的物理引擎 我一直在互联网上搜索 尝试 但失败 解决我当前的问题 关于这个主题有很多资源 但我发现的资源似乎都不适用于我的情况 问题简而言之 当两个矩形碰撞时 碰撞
  • 在cocos2D游戏环境中应用缩放效果?

    我正在开发一款游戏cocos2D游戏引擎并加载所有sprites当它加载关卡时 现在因为一些sprites 障碍物 高于 320 像素 因此看起来很难检查出来 所以为了方便起见我想申请ZOOM IN and ZOOM out效果 一次最小化
  • corona sdk中拖动物理对象

    我尝试在场景中拖动重力 0 0 的动态主体 我有一个主体类型为动态的正方形 以及一个主体类型为静态的图像 但是当将方形拖动到图像上时 它会产生一点力 但是可以超出图像并传递到另一边 如图所示 这是我拖动正方形的代码 local functi
  • Windows 8 SDK 中的 DirectX

    Summary 是否应该从针对 Windows 8 的应用程序中删除 directX 包含文件 Details 我是 Windows 开发新手 我正在尝试使用 Visual Studio 2012 如果可能 在 Windows 8 上编译
  • 矩阵乘法 - 视图/投影、世界/投影等

    在 HLSL 中有很多矩阵乘法 虽然我了解如何以及在何处使用它们 但我不确定它们是如何导出的或它们的实际目标是什么 所以我想知道是否有在线资源可以解释这一点 我特别好奇将世界矩阵乘以视图矩阵以及世界 视图矩阵乘以投影矩阵背后的目的是什么 您
  • 关于制作点击游戏的资源(无闪光)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我玩过很多点击式冒险游戏 Broken Sword Sam Max Dott Indiana Jones 等 我想了解如何创建这样的游戏
  • Shader的功能参数表现

    我试图了解如何在着色器语言中实现传递参数 我读过几篇文章和文档 但仍然有一些疑问 特别是我试图理解与C 函数调用 特别强调性能 之间略有差异HLSL Cg and GLSL但我猜下划线的实现非常相似 到目前为止我所理解的 除非另有说明 函数
  • DirectX 照明

    你好 我有一个使用 directX10 和 C 的小游戏 然而 我开始使用 OBJ10 direct X 示例的 meshloader 来制作它 并且我刚刚在它的基础上进行构建 然而 我的物体虽然有颜色 但看上去都是纯黑色的 我知道这是因为
  • 如何在 C++ 中急于提交分配的内存?

    总体情况 带宽 CPU 使用率和 GPU 使用率都极其密集的应用程序需要每秒从一个 GPU 向另一个 GPU 传输约 10 15GB 的数据 它使用 DX11 API 来访问 GPU 因此上传到 GPU 只能在每次上传都需要映射的缓冲区中进

随机推荐

  • WinSCP .NET 程序集:在哪里定义代理?

    我可以使用 WinSCP GUI 定义代理服务器 如果我这样做 我就可以连接到远程主机 但在代码中我没有找到为 WinSCP 声明代理服务器的方法 在这种情况下我收到 远程服务器返回错误 407 需要代理身份验证 My code Sessi
  • 将 csv 文件转换为 PHP 二维数组

    我是 PHP 新手 一直在努力将 CSV 文件读入二维数组 我使用以下文件 csv team csv ID Nickname Shirtnumber Position 1 Jimmy 0 RightBack 2 Mark 3 CentreB
  • Hibernate/JPA - 访问 SingularAttribute 参数时出现 NullPointerException

    我正在尝试将 JPA2 类型安全标准查询与 Hibernate 5 0 7 Final 一起使用 criteria where builder equal root get SingularAttribute attr value wher
  • 如果没有指定目标,“make”应用程序如何知道要构建的默认目标?

    大多数 Linux 应用程序都是通过以下方式编译的 make make install clean 据我了解 make命令将构建目标的名称作为参数 例如install通常是将一些文件复制到标准位置的目标 并且clean是删除临时文件的目标
  • 在表单中搜索具有多个字段的 MySQL 数据库

    我创建了一个表单 用户可以在其中搜索数据库 结果取决于用户如何填写表单 例如 假设我有姓名 地 址 城市 州和邮政编码字段 并且用户填写了姓名和城市字段 结果会反映输入 当表单提交时 所有记录都会显示 为此我写了这个 if isset PO
  • JAVA:正确访问静态方法

    我是JAVA新手 我喜欢尝试并理解一切 在JAVA中访问静态方法 hero returnHp 时 我有以下内容 hero Mike new hero Mike returnHp 程序运行良好 但我注意到 Eclipse 有一条警告 指出 英
  • 如何在java中在windows和IANA时区之间进行转换

    我需要在 IANA 时区和 Windows 时区之间进行转换 反之亦然 还有一个问题被报道 如何在 Windows 时区和 IANA 时区之间进行转换 它指定Noda时间库可以在 Net中使用 我们有可以在 Java 中使用的库吗 或者ja
  • vim 中的条件正则表达式?

    是否可以执行条件正则表达式 就像中描述的那样 http www regular expressions info conditional html 在 Vim 中 Vim 正则表达式没有此功能 因此您需要使用一些重复来创建相同的行为 con
  • iPhone 本地化 - 获取手机的语言代码?

    我正在将我的 iPhone 应用程序本地化为多种语言 除了更改一些字符串之外 我还需要更改一些背景 是否可以查询iPhone并获取用户的语言代码 Thanks 看看 NSLocale NSString language NSLocale c
  • iOS 自动布局 - 如何设置视图之间的两个不同距离,取决于屏幕高度

    我知道我错过了一些东西 因为这必须是很容易实现的东西 我的问题是 我的 加载屏幕 启动后立即出现的屏幕 中有一个 UIImageView 其中包含 3 5 英寸和 4 英寸尺寸屏幕的两个不同图像 在该图像的某个位置 我放置了一个 UIAct
  • 从jade内部获取用户代理

    我正在尝试将我为groovy编写的脚本移植到jade 但遇到了绊脚石 我需要从玉文件内部访问用户代理 这是我到目前为止所尝试过的 var agent req headers user agent var agent headers user
  • 有没有办法为@AllArgsConstructor(lombok)的所有参数设置“not null”

    我正在使用 AllArgsConstructor我的类中的注释并希望确保参数不为空 有没有办法修改这个注释来实现这一点 或者我应该实现构造函数 谢谢 Getter Setter ToString AllArgsConstructor pub
  • 如何在 UIlabel 中将上标 % 字符显示为字符串?

    如何在 UIlabel 中将上标 字符显示为字符串 我知道 在 unicode 中不存在作为上标 但是有什么方法我们可以将 显示为上标而不是使用 html 标签 我在 Stackoverflow 上找到了这篇关于使用属性字符串的上标样式文本
  • Scala 数组与向量

    Scala 新手 我很困惑 object myApp extends App println Echo args mkString args 是Array String 类型 但在scaladoc中 Array没有这样的方法 mkStrin
  • Codeigniter JOIN(SELECT 查询

    可以通过 CI 查询生成器类生成以下查询吗 SELECT name FROM table1 t1 JOIN SELECT ID FROM table2 ORDER BY id LIMIT 5 t2 ON t2 id t1 t2 id WHE
  • Dart 错误:错误:当前 Dart 运行时不支持导入 dart:mirrors

    我目前正在尝试使用 Flutter 编写一些移动代码 我正在尝试使用 gcloud 库 dart 将数据发布 订阅到 GCP Cloud Pub Sub 这是 main dart 的代码 import dart io import pack
  • 如何将 ZF2 与 Doctrine Mongo ODM 集成? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在尝试将zf2 beta3与doctrine mongo odm https git
  • 使用 lambda 表达式获取属性名称和类型

    我正在尝试编写一个函数 该函数将使用如下语法提取属性名称和类型 private class SomeClass Public string Col1 PropertyMapper
  • std::ofstream::write 添加字符

    我正在尝试使用编写二进制文件std ofstream write方法 我发现 有些字符不是按原样写的 例如 std ofstream in testout int i 10 in write const char i sizeof i in
  • 在 DX10/DX11 中使用多个顶点缓冲区

    我有一个我一直在编写的 C DirectX 11 渲染器 我编写了一个 COLLADA 1 4 1 加载程序来导入 COLLADA 数据以用于支持骨骼动画 我此时正在验证加载程序 并且我之前在我之前使用不同技术编写的另一个渲染器中支持过 C