我有一个大小为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}正如我所期望的那样(前面和后面是正确的) - 然后诙谐地向我报告这是一个错误 - 当它时犯了错误。
我做了仔细检查D3D11_BOX是否正确(文档说" 右,底部和背面的值分别是像素末端的一个像素包含在框区域")。
我不想乱用偏移或创建一个带有错误宽度和高度(1281x721)的临时表面,只是为了让这个错误消失,所以我这是错误的错误或者我在不知不觉中做错了什么? (我在为D3D11编码方面还很陌生。)
答案 0 :(得分:1)
答案是我有点愚蠢。 DstSubresource框(分段表面中的目标)确实是正确的:它的宽度为1280像素,因此像素从#0到#1279(#1280是一个像素超过结束)。
我出错的地方是源区域的规范,我用其指定的框:
left = 0;
top = 0;
right = width + 1;
bottom = height + 1;
一旦我正确地注意到“宽度”和“+1”同时存在(高度相同),当它总是 width =(右 - 左)当然因此不一样,我意识到自己的错误。
所以,这与编写D3D11的新内容无关,而且与疏忽错误有关。