UpdateSubresource如何知道要复制多少?

时间:2016-09-09 12:32:10

标签: c++ unity3d direct3d direct3d11

我试图将图像从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的图像参数只是图像缓冲区指针和步幅,而不是图像的高度或缓冲区的长度。

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

这段代码对我来说对某些图片很有用,但对其他人来说并不起作用 - 它会在内存上引发一个超出图像缓冲区大小的访问冲突 - 这样就暗示我没有设置在某处限制。

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:2)

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

然而,这个texturePointer间接是什么?如果您使用的是c ++(而不是c),那么您可能应该使用简单的lpVtbl方法来调用COM方法。