【发布时间】:2010-10-29 23:54:51
【问题描述】:
为不了解 DirectX 的人提供一些背景知识。顶点不仅仅是一个 XYZ 位置,它可以包含其他数据。 DirectX 使用称为灵活顶点格式 (FVF) 的系统,让您定义希望顶点采用的格式。您可以通过将数字传递给使用按位或构建它的 DirectX 来定义这些格式,例如 (D3DFVF_XYZ | D3DFVF_DIFFUSE)表示您将开始使用(从您告诉 DirectX 时开始)具有 XYZ(三个浮点数)和 RGB 分量(DWORD / unsigned long)的顶点。
为了将您的顶点传递给显卡,您基本上将内存锁定在缓冲区所在的显卡中,并使用 memcpy 将您的数组传输过来。
您的数组是您定义自己的结构的数组,因此在这种情况下,您将创建一个类似...的结构
struct CUSTOMVERTEX {
FLOAT X, Y, Z;
DWORD COLOR;
};
然后创建一个 CUSTOMVERTEX 类型的数组并填写数据字段。
我认为我最好的方法是让我的班级为每个组件类型建立一个数组,所以一个 struct pos{ flaot x,y,z;}; 的数组struct colour{ DWROD colour;}; 的数组等等。
但是我需要将它们合并在一起,这样我就有了一个像 CUSTOMVERTEX 这样的数组结构。
现在,我想我已经创建了一个可以将数组合并到一起的函数,但我不确定它是否会按预期工作,就在这里(目前缺少实际返回这个“交错”数组的能力)
void Utils::MergeArrays(char *ArrayA, char *ArrayB, int elementSizeA, int elementSizeB, int numElements)
{
char *packedElements = (char*)malloc(numElements* (elementSizeA, elementSizeB));
char *nextElement = packedElements;
for(int i = 0; i < numElements; ++i)
{
memcpy(nextElement, (void*)ArrayA[i], elementSizeA);
nextElement += elementSizeA;
memcpy(nextElement, (void*)ArrayB[i], elementSizeB);
nextElement += elementSizeB;
}
}
调用此函数时,您将传入要合并的两个数组,以及每个数组中元素的大小和数组中的元素个数。
我在聊天中询问了这个问题,当时 SO 很失望。有几件事要说。
我正在处理相当小的数据集,比如 100 个顶部,而这(理论上)更像是一个初始化任务,所以应该只完成一次,所以我可以花一点时间。
我希望能够使用 memcpy 传输到显卡的最终数组需要没有填充,它必须是连续数据。
EDIT 顶点数据的组合数组将被传输到 GPU,这首先通过请求 GPU 将 void* 设置为我可以访问的内存的开头并请求空间来完成我的 customVertex * NumOfVertex 的大小。因此,如果我的 mergeArray 函数确实松散了其中的类型,那没关系,只要我让我的单个组合数组在一个块中传输 /EDIT
最后,他们是一个很好的机会,我用这个来找错树了,所以他们可能是一个更简单的方法来解决这个问题,但我的一部分已经挖掘了我的治疗并且想让这个系统正常工作,所以我希望知道如何让这样一个系统工作(交错阵列的事情)
非常感谢...我现在需要冷静一下,所以我期待听到有关此问题的任何想法。
【问题讨论】:
-
CUSTOMERVERTEX 数组您面临什么问题?为什么要考虑将我们的 VERTEX 和 COLOR 分开?
-
我不想将它们分开,我想获取组件数组并将它们合并在一起,以便我拥有一个 customvertex 类型的数组,除了,我不知道到底是什么,直到运行时我的 FVF(因此我的自定义顶点中的数据)将是。
-
你知道从 DX8 开始就不需要 FVF 格式了吧?
-
@jalf 等什么?我知道我可以加载 .x 文件
-
检查顶点缓冲区的 D3D 文档。假设您不是在查看 DX8 版本,他们提到您可以创建 FVF 缓冲区,但还描述了如何使用顶点声明来实现大致相同的目标,但具有更大的灵活性。 FVF 必要 的唯一情况是如果您想使用
ProcessVertices写入顶点缓冲区。阅读msdn.microsoft.com/en-us/library/bb206332%28VS.85%29.aspx、msdn.microsoft.com/en-us/library/bb204869%28VS.85%29.aspx和msdn.microsoft.com/en-us/library/bb173428%28v=VS.85%29.aspx
标签: c++ arrays algorithm memory directx