c++ - UpdateSubresource 如何知道要复制多少?

标签 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 如何知道何时停止复制?

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

有人可以阐明这一点吗?

最佳答案

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

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

关于c++ - UpdateSubresource 如何知道要复制多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39411697/

相关文章:

c# - Unity3D 中 GC 和卸载 Assets 的顺序

opengl - 渲染具有多个索引的网格

c++ - 在什么情况下 vtable 指针可以为空(或 0x1)?

c++ - 为什么 std::unique_ptr 比标准指针慢得多……在优化之前?

C++ 类设计 - 轻松初始化/构建对象

c++ - 无法在 qt-creator 中调试,cdb 崩溃 0xC0000135

c# - 有色 Sprite 实际上是在较新版本的 Unity 中进行批处理吗?

unity3d - 在 Unity 中保存和加载整个场景

c++ - LPD3DXFONT 不绘制

c++ - 基于 2D 图 block 的游戏,当我用相机放大时,图 block Sprite 之间会出现间隙吗?