CopySubresourceRegion 报错源框大小错误?
CopySubresourceRegion incorrectly reports an error about the size of the source box?
我有一个大小为 2560x1440 的源 ID3D11Texture2D(来自屏幕截图),其中四分之一(宽度和高度的一半)我正在复制到一个宽度为 1280 (=2560/2) 的临时 ID3D11Texture2D 表面中,并且720 (=1440/2) 的高度(在调用 ID3D11Device::CreateTexture2D() 之前在 D3D11_TEXTURE2D_DESC 中指定)。
打电话..
ID3D11DeviceContext::CopySubresourceRegion(dst=staging, 0, 0, 0, 0, src=screenshot, 0, box={0,0,0,1281,721,1});
.. 工作正常(暂存表面包含我期望的所有数据),但 D3D11 调试层报告以下错误:
D3D11 ERROR: ID3D11DeviceContext::CopySubresourceRegion: When offset by the destination coordinates, pSrcBox does not fit on the destination subresource.
OffsetSrcBox = { left:0, top:0, front:0, right:1281, bottom:721, back:1 }.
DstSubresource = { left:0, top:0, front:0, right:1280, bottom:720, back:1 }.
[ RESOURCE_MANIPULATION ERROR #280: COPYSUBRESOURCEREGION_INVALIDSOURCEBOX]
由于暂存(目标)表面的 width 和 height 是 1280 和 720,在我看来它是 CopySubresourceRegion错误地将 DstSubresource 计算为 {0,0,0,1280,720,1} - 而不是 {0,0,0,1281 ,721,1} 正如我所期望的那样(front 和 back 是正确的) - 然后厚颜无耻地向我报告这是一个错误 - 当 it 犯了错误。
我 did 仔细检查 D3D11_BOX 是否正确(文档说“右边、底部和背面的值都是一个超出框区域中包含的像素末尾的像素").
我不想乱用偏移量或使用 错误的 宽度和高度 (1281x721) 创建暂存表面只是为了让这个错误消失,所以我是正确的这个错误具有误导性,还是我在不知不觉中做错了什么? (我对 D3D11 的编码还是很陌生。)
答案是我有点笨。 DstSubresource 框(暂存表面中的目标)确实是正确的:它有 1280 像素宽,所以像素从 #0 到 #1279(#1280 是 结束后的一个像素 ).
我在源区域的规范中出错,我指定的框是:
left = 0;
top = 0;
right = width + 1;
bottom = height + 1;
当我正确地注意到 "width" 和“+1”在一起(高度相同)时,它总是 width = (right-left)当然,因此不一样,我意识到我的错误。
所以,这与 D3D11 的编码新手无关,而与注意力不集中有关。
我有一个大小为 2560x1440 的源 ID3D11Texture2D(来自屏幕截图),其中四分之一(宽度和高度的一半)我正在复制到一个宽度为 1280 (=2560/2) 的临时 ID3D11Texture2D 表面中,并且720 (=1440/2) 的高度(在调用 ID3D11Device::CreateTexture2D() 之前在 D3D11_TEXTURE2D_DESC 中指定)。
打电话..
ID3D11DeviceContext::CopySubresourceRegion(dst=staging, 0, 0, 0, 0, src=screenshot, 0, box={0,0,0,1281,721,1});
.. 工作正常(暂存表面包含我期望的所有数据),但 D3D11 调试层报告以下错误:
D3D11 ERROR: ID3D11DeviceContext::CopySubresourceRegion: When offset by the destination coordinates, pSrcBox does not fit on the destination subresource.
OffsetSrcBox = { left:0, top:0, front:0, right:1281, bottom:721, back:1 }.
DstSubresource = { left:0, top:0, front:0, right:1280, bottom:720, back:1 }.
[ RESOURCE_MANIPULATION ERROR #280: COPYSUBRESOURCEREGION_INVALIDSOURCEBOX]
由于暂存(目标)表面的 width 和 height 是 1280 和 720,在我看来它是 CopySubresourceRegion错误地将 DstSubresource 计算为 {0,0,0,1280,720,1} - 而不是 {0,0,0,1281 ,721,1} 正如我所期望的那样(front 和 back 是正确的) - 然后厚颜无耻地向我报告这是一个错误 - 当 it 犯了错误。
我 did 仔细检查 D3D11_BOX 是否正确(文档说“右边、底部和背面的值都是一个超出框区域中包含的像素末尾的像素").
我不想乱用偏移量或使用 错误的 宽度和高度 (1281x721) 创建暂存表面只是为了让这个错误消失,所以我是正确的这个错误具有误导性,还是我在不知不觉中做错了什么? (我对 D3D11 的编码还是很陌生。)
答案是我有点笨。 DstSubresource 框(暂存表面中的目标)确实是正确的:它有 1280 像素宽,所以像素从 #0 到 #1279(#1280 是 结束后的一个像素 ).
我在源区域的规范中出错,我指定的框是:
left = 0;
top = 0;
right = width + 1;
bottom = height + 1;
当我正确地注意到 "width" 和“+1”在一起(高度相同)时,它总是 width = (right-left)当然,因此不一样,我意识到我的错误。
所以,这与 D3D11 的编码新手无关,而与注意力不集中有关。