0

嗨,我正在使用着色器,我有一个关于我是否可以在这里做某事的快速问题。当将数据映射到缓冲区时,我通常会看到它是这样完成的。定义类或结构来表示缓冲区中的内容。

class MatrixBuffer
{
public:
    D3DXMATRIX worldMatrix;
    D3DXMATRIX viewMatrix;
    D3DXMATRIX projectionMatrix;
} 

然后在创建输入布局时设置输入元素描述,我得到了所有这些。现在,当我看到人们在渲染之前更新缓冲区时,我看到它大多是这样完成的:

MatrixBuffer * dataPtr;
if(FAILED(deviceContext->Map(m_matrixBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource)))
        return false;

dataPtr = (MatrixBuffer *) mappedResource.pData;
dataPtr->world = worldMatrix;
dataPtr->view = viewMatrix;
dataPtr->projection = projectionMatrix;

deviceContext->Unmap(m_matrixBuffer, 0);

其中分配的值实际上是有效的 D3DXMATRIX。看来没关系,如果我这样做会不会有什么问题?

MatrixBuffer* dataPtr;
if(FAILED(deviceContext->Map(m_matrixBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource)))
            return false;

dataPtr = (MatrixBuffer *) mappedResource.pData;
*dataPtr = matrices;

deviceContext->Unmap(m_matrixBuffer, 0);

矩阵是一个有效填写的 MatrixBuffer 对象?由于某些特殊的直接 X 处理此问题,以后会不会产生可怕的后果,还是可以?

4

2 回答 2

1

从技术角度来看,我认为您的版本没有任何问题。

掌握实际复制到那里的内容可能会稍微困难一些,从理论上讲,生成的代码应该几乎相同——我希望任何体面的优化器都会注意到“长”版本只是复制了几个连续的项目,并将它们全部合并到一个更大的副本中。

于 2012-07-08T09:17:02.140 回答
0

尝试避免使用映射,因为它会停止管道。对于每帧更新一次的内容,最好使用 D3D11_USAGE_DEFAULT 缓冲区,然后使用 UpdateSubresource 方法将新数据推入。更多信息请参见:http: //blogs.msdn.com/b/shawnhar/archive/2008/04/ 14/停止管道.aspx

于 2012-07-08T17:02:12.187 回答