我正在尝试从 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 如何知道何时停止复制?
此代码适用于某些图像,但不适用于其他图像 - 它会引发内存访问冲突,超出图像缓冲区大小 - 所以这暗示我我没有在某处设置限制。
有人可以阐明这一点吗?
最佳答案
您正在正确使用该函数 - 目标资源(在您的情况下由 texturePointer
引用)包含所有必需的数据,并且该方法将按预期工作。
但是,这个lpVtbl
间接寻址是做什么用的?如果您使用的是 c++(而不是 c),您可能应该坚持使用简单的 pInstance->Method()
方法来调用 COM 方法。
关于c++ - UpdateSubresource 如何知道要复制多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39411697/