UpdateSubresource 如何知道要复制多少?

How does UpdateSubresource knows how much to copy?

我正在尝试从 C++ 将图像复制到 Unity 纹理。图片为 320x240px,格式为 RGBA。我已经确认图片没问题。

要复制,我使用 UpdateSubresource,代码如下:

GraphicDeviceD3D11* gdevice = (GraphicDeviceD3D11*)graphic_device;
ID3D11DeviceContext* ctx = NULL;
gdevice->d3d11device->lpVtbl->GetImmediateContext(gdevice->d3d11device, &ctx);

if (texturePointer) {
    ctx->lpVtbl->UpdateSubresource(ctx, (ID3D11Resource *)texturePointer, 0, NULL, image, imageWidth * 4, 0);
}

ctx->lpVtbl->Release(ctx);

我算不上 d3d11 专家,不确定我是否正确使用了这个功能。给UpdateSubresource的图片参数只有图片缓冲区指针和步幅,没有图片的高度OR缓冲区的长度。

UpdateResource 如何知道何时停止复制?

此代码适用于某些图像,但不适用于其他图像 - 它会引发内存访问冲突,超出图像缓冲区大小 - 所以这暗示我我没有在某处设置限制.

有人可以解释一下吗?

您正在正确使用该函数 - 目标资源(在您的情况下由 texturePointer 引用)包含所有必需的数据,该方法将按预期工作。

但是,这个 lpVtbl 间接寻址是做什么用的?如果您使用的是 c++(而不是 c),您可能应该坚持使用简单的 pInstance->Method() 方法来调用 COM 方法。