因此,我目前正在directxtutorial.com上学习Direct3D9,并通过void* pVoid
函数遇到了vbuffer->Lock()
。我知道什么是void *,我只是不明白为什么在这种情况下我们需要它。该网站说pVoid将被创建的顶点在内存中的位置填充,但这不只是vbuffer的位置?如果是这样,为什么我们不能在锁定后仅使用memcpy将顶点直接复制到vbuffer中,为什么我们需要将它们复制到pVoid中?预先感谢您的帮助。
缓冲区为void
类型的基本原因是因为它没有固有类型。如果它是D3DFMT_A8R8G8B8
,则可以将其强制转换为uint32_t*
,因为每个像素都是32位。如果是D3DFMT_A32B32G32R32F
,则可以将其强制转换为float*
。如果只想按字节工作,则可以将其强制转换为uint8_t*
。
此时,您不应该学习Direct3D9。它已有20多年的历史了,在很大程度上被认为是传统。 Direct3D 11是一个更好的起点。参见this blog post和DirectX Tool Kit。也就是说,出于所有相同的原因,
Map
仍以void*
的形式返回指向锁定内存Direct3D资源的指针。