在 Windows 应用商店应用中映射 Direct3D11 中的动态缓冲区
Mapping a dynamic buffer in Direct3D11 in a Windows Store App
我正在尝试在 Direct3D11 中创建实例化几何图形,当我尝试更新实例缓冲区时,ID3D11DeviceContext1->Map()
调用失败并出现非常有用的"参数无效"错误。
缓冲区声明为成员变量:
Microsoft::WRL::ComPtr<ID3D11Buffer> m_instanceBuffer;
然后我创建它(成功):
D3D11_BUFFER_DESC instanceDesc;
ZeroMemory(&instanceDesc, sizeof(D3D11_BUFFER_DESC));
instanceDesc.Usage = D3D11_USAGE_DYNAMIC;
instanceDesc.ByteWidth = sizeof(InstanceData) * MAX_INSTANCE_COUNT;
instanceDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
instanceDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
instanceDesc.MiscFlags = 0;
instanceDesc.StructureByteStride = 0;
DX::ThrowIfFailed(d3dDevice->CreateBuffer(&instanceDesc, NULL, &m_instanceBuffer));
但是,当我尝试映射它时:
D3D11_MAPPED_SUBRESOURCE inst;
DX::ThrowIfFailed(d3dContext->Map(m_instanceBuffer.Get(), 0, D3D11_MAP_WRITE, 0, &inst));
映射调用失败,并显示 E_INVALIDARG
。 没有什么NULL
不正确的,这是我的第一个D3D应用程序之一,我目前不知道下一步该怎么做才能追踪它。 我想我一定是错误地创建了缓冲区,但我看不出如何。 任何意见将不胜感激。
因为缓冲区是用D3D11_USAGE_DYNAMIC
创建的,所以它必须用D3D_MAP_WRITE_DISCARD
(或D3D_MAP_WRITE_NO_OVERWRITE
映射,但这不适合我的应用程序)。
当我尝试为着色器创建缓冲区时,我遇到了同样的问题。在createBuffer
它总是会给我E_INVALIDARG
.我的项目的问题是,我忘记将所有属性对齐到 16 字节。下面是一个示例:
struct TessellationBufferType
{
float tessellationAmount; //4bytes
D3DXVECTOR3 cameraPosition; //12bytes
};
如果您没有得到 16,请添加一个额外的变量(例如填充)以对齐最多 16:
struct LightBufferType
{
D3DXVECTOR4 ambientColor; //16
D3DXVECTOR4 diffuseColor; //16
D3DXVECTOR3 lightDirection; //12
float padding; //4
};
相关文章:
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- Vulkan 中的动态顶点缓冲区格式设置
- 从OpenGL应用程序中提取颜色/深度缓冲区
- 导致堆缓冲区错误的动态分配数组的析构函数
- 我正在编写一个简单的客户端套接字应用程序,但在连接后服务器收到一个空缓冲区
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- Qt是否能够支持小缓冲区低延迟视频应用(例如实时流)
- 从C 中的函数中动态分配的缓冲区返回的最佳模式是什么?
- 协议缓冲区2和3在同一C Linux应用程序中
- 用于保存按下的键的动态缓冲区 - c++
- CRT 检测到应用程序在堆缓冲区(新建/删除)类结束后写入内存
- 将运算符重写应用于具有动态分配指针的类
- 将包含位字段和动态数据的结构复制到 Char 数组缓冲区中
- 是否可以动态翻译QT应用程序而无需复制代码
- 如何在 MDI MFC C++ Windows 应用程序中动态更改 CFormView 宽度或高度?
- Vulkan中动态统一缓冲区的缓冲区内存分配
- 如何使用 std::make_shared 创建动态大小缓冲区
- 在 Windows 应用商店应用中映射 Direct3D11 中的动态缓冲区
- 如何在此处应用动态编程
- 带有动态缓冲区的Windows readfile