DirectX11在不使用memcpy的情况下映射顶点
DirectX11 mapping vertex without using memcpy
显然,我在使用memcpy 将vertex缓冲区映射到GPU方面遇到了一些问题
这是我的初始代码
D3D11_MAPPED_SUBRESOURCE MappedResource;
ID3D11Buffer *pBuffer = s_vertexBuffers.pBuffers[i].Get();
HRESULT hr = s_d3dContext->Map(pBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource);
float *vertices = (float *) MappedResource.pData,
*data = (float *)s_vertexBuffers.pData[i];
int len = s_vertexBuffers.pStrides[i];
if (i != VERTEX_BUFFER::COLOR)
{
len *= total;
}
memcpy(vertices, data, len);
s_d3dContext->Unmap(pBuffer, 0);
我要改变的是使用指针映射(将数据从缓冲区复制到GPU)的方式,就像这里指向的一样,映射到类似于SetShaderParameters函数的东西(也在教程中),即使用指针获取缓冲区中的数据,并直接使用指针将数据复制到中
基本上,线路float*顶点=(float*)MappedResource.pData直到memcpy(顶点、数据、len);
将被更改为类似上面的教程指出的
这就是我的代码现在的样子
VertexBuffers *dataPtr;
dataPtr = (VertexBuffers *)MappedResource.pData;
dataPtr->pBuffers[i] = s_vertexBuffers.pBuffers[i].Get();
dataPtr->pData[i] = s_vertexBuffers.pData[i];
dataPtr->pSizes[i] = s_vertexBuffers.pSizes[i];
dataPtr->pStrides[i] = s_vertexBuffers.pStrides[i];
if (i != VERTEX_BUFFER::COLOR)
{
dataPtr->pStrides[i] *= total;
}
结构体VertexBuffers和VERTEX_BUFFER命名空间内容为
namespace VERTEX_BUFFER
{
enum : int
{
POSITION,
COLOR,
TEXCOORD,
COUNT
};
}
struct VertexBuffers
{
ComPtr<ID3D11Buffer> pBuffers[VERTEX_BUFFER::COUNT];
void* pData[VERTEX_BUFFER::COUNT];
UINT pStrides[VERTEX_BUFFER::COUNT];
UINT pSizes[VERTEX_BUFFER::COUNT];
};
我认为问题是,每当我试图使用指针复制数据时,我都没有像memcpy那样考虑len
由于我目前正在学习DirectX和编程,如果我的解释有什么不正确的地方,请纠正我。
为糟糕的代码和糟糕的编程技巧感到抱歉,也为糟糕的英语感到抱歉,干杯!
你想要这样的东西吗?
VertexBuffers *dataPtr;
dataPtr = (VertexBuffers *)MappedResource.pData;
dataPtr->pBuffers[i] = s_vertexBuffers.pBuffers[i].Get();
dataPtr->pSizes[i] = s_vertexBuffers.pSizes[i];
dataPtr->pStrides[i] = s_vertexBuffers.pStrides[i];
if (i != VERTEX_BUFFER::COLOR)
{
dataPtr->pStrides[i] *= total;
}
memcpy(dataPtr->pData[i], s_vertexBuffers.pData[i], dataPtr->pStrides[i]);
正如您所发现的,当您有两个指针(比如p和q)时,p = q;
所做的就是复制指针。如果要复制所指向的数据,则应编写memcpy(p, q, size_of_data);
。
相关文章:
- 在未初始化映射的情况下,将值插入到映射的映射中
- 将类型映射到整数值后,如何在给定整数值的情况下恢复类型?
- 如何在没有映射的情况下在枚举和字符串之间进行转换?
- 在不创建新节点的情况下实现带有映射的trie
- 有没有办法在不使用循环的情况下非具体地引用映射中的每个值?C++
- qfiledialog:gtkdialog在没有瞬态父母的情况下映射
- 如何在不违反封装的情况下合法访问和修改私有字段矢量和映射
- DirectX11在不使用memcpy的情况下映射顶点
- 在没有c++11的情况下,擦除映射中最后插入的元素的正确方法是什么
- 切换情况下映射迭代器的交叉初始化
- 在不增加引用计数的情况下迭代共享指针的映射
- 在这种情况下,我是否需要清空映射的内容以避免内存泄漏
- 是否可以在不调用包含对象的析构函数的情况下清空映射的内容?
- 使用自己的比较器运算符()进行映射<>。在找不到 KEY 的情况下给出错误
- 如何在不实际插入的情况下找到元素将插入std::映射的位置
- Boost::在gcc4.6不工作的情况下分配一个大映射的静态初始化
- 在实时应用程序中最坏情况下执行的最快c++映射
- 如何在不违反严格的混叠规则的情况下访问内存映射的多字节寄存器
- 有没有一种方法可以在不删除内容的情况下从C++映射中删除键
- 如何在不分配内存的情况下将openv映射到具有对齐支持的特征