我使用的是DirectX11,我在使用Map / Unmap功能时遇到了一些问题。
第一个问题是我应该使用Map / Unmap还是UpdateSubresource?谷歌已经提出了人们说一个比另一个更快的页面,所以我绝对不确定哪个更快。
回答(参见我对此的评论)。
问题2:
我需要在CPU上操作纹理并将其发送到GPU然后渲染它。我的纹理标志如下。
textureDesc.Width = textureWidth;
textureDesc.Height = textureHeight;
textureDesc.ArraySize = 1;
textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
textureDesc.SampleDesc.Count = 1;
textureDesc.Usage = D3D11_USAGE_DEFAULT;
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
textureDesc.CPUAccessFlags = 0;
textureDesc.MiscFlags = 0;
纹理很好但是当我运行" Map" function我收到错误"一个或多个参数无效。"。
回答(参见我对此的评论)。
问题3.我有以下代码写入纹理(只是测试代码),它有什么问题吗?
result = deviceContext->Map(m_renderTargetTexture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
FLOAT* pTexels = (FLOAT*)mappedResource.pData;
for( UINT col = 0; col < 20; col++ )
{
pTexels[col*4 + 0] = 1; // Alpha
pTexels[col*4 + 1] = 1; // Blue
pTexels[col*4 + 2] = 1; // Green
pTexels[col*4 + 3] = 1; // Red
}
deviceContext->Unmap(m_renderTargetTexture, 0);
D3DX11SaveTextureToFile( deviceContext, m_renderTargetTexture, D3DX11_IFF_JPG, L".\.\FILE.jpg");
最后的问题更多是对最佳实践的调查。我需要发送一组数据(1D,2D和最终3D)。我的问题是从CPU发送数据到GPU的最佳方法是什么。通过在CPU上创建的纹理然后传递给GPU?或者还有其他方法更好吗?
感谢。
问题3的工作代码。但是,尝试使用此纹理创建渲染目标视图失败,我不确定为什么。几乎可以肯定与我正在使用的描述有关。
UCHAR* pTexels = (UCHAR*)mappedResource.pData;
for( UINT row = 0; row < textureDesc.Height; row++ )
{
//Row number * height
UINT rowStart = row * mappedResource.RowPitch;
for( UINT col = 0; col < textureDesc.Width; col++ )
{
//width * number of channels (r,g,b,a)
UINT colStart = col * 4;
pTexels[rowStart + colStart + 0] = 255; // Red
pTexels[rowStart + colStart + 1] = 0; // Green
pTexels[rowStart + colStart + 2] = 0; // Blue
pTexels[rowStart + colStart + 3] = 255; // Alpha
}
}