我正在使用Unity和Hololens编写使用相机的应用程序。它工作正常。然后我改变了一些东西(稍后解释)并且在崩溃后我得到了以下错误:
d3d11:无法创建分段2D纹理w = 896 h = 504 d3dfmt = 87 [887a0005]
d3d11:无法锁定大小为4194304 [0x8007000E]的缓冲区1104C69C。
DrawBuffers()获得了一系列索引但没有索引缓冲区(文件名: C:\ buildslave \团结\编译\运行/ GfxDevice / D3D11 / DrawBuffersD3D11.cpp 行:137)
我搜索过这些错误,但没有适用的解决方案。我希望我能对此有所了解。
我在做什么,改变了什么
基本上,程序以字节byte[] _latestImage;
的数组从相机中获取帧
最初此图像应用于纹理,如
_videoTexture.LoadRawTextureData(_latestImage);
_videoTexture.wrapMode = TextureWrapMode.Clamp;
_videoTexture.Apply();
_videoPanelUIRenderer.sharedMaterial.SetTexture("_MainTex", _videoTexture);
其中_videoTexture
是Texture2D,_videoPanelUIRenderer
是渲染器。
这是正确的。然后我处理了数组_latestImage,将其转换为函数ProcessSync
内的Gray。这也适用于唯一的问题:由于数组正在被处理(变成灰色)但是也正在由相机自动更新,当应用到纹理时,它会闪烁,有时是灰色的,有时候彩色。但除此之外,没有崩溃。
所以我的下一步是在处理函数开始时克隆该数组,以便我可以处理这个新数组并将其应用于纹理,而不会干扰来自相机的新数据。
所以我做了:
void ProcessSync(byte[] rawimage, Matrix4x4 cTwMatrix, Matrix4x4 pMatrix)
{
int rr, gg, bb;
int p = 0;
int yval;
byte[] image=(byte[])rawimage.Clone();//<--THIS is the only change
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
{ //...some processing here
}
//Then apply it to the texture like indicated above
}
当我应用它时,应用程序工作正常,我可以看到我正在获取灰色图像...但过了一段时间它崩溃了上面的消息。
我的图片是896x504,所以我想
d3d11:无法创建分段2D纹理w = 896 h = 504 d3dfmt = 87 [887a0005]
意味着某种方式无法创建Texture2D但为什么?我的纹理只在视频模式初始化时创建一次,所以我不明白为什么会发生这种情况。
我猜错误可能与我克隆图像有关。有人能帮我一下吗?
答案 0 :(得分:2)
正如@Equalsk在评论中提到的那样,可能有可能重用原始数组(考虑到Array是一种引用类型)。你可以做的一件事是在传入ProcessSync()
之前创建一个数组副本,这样就不会在方法中使用原始指针。
我建议的另一件事:方法应该有单一的责任(返回已处理的数组)。然后应将结果byte[]
应用于纹理。
byte[] ProcessSync(byte[] image, Matrix4x4 cTwMatrix, Matrix4x4 pMatrix)
{
int rr, gg, bb;
int p = 0;
int yval;
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
{ //...some processing here
}
return image;
}
然后按如下方式使用它:
var image = ProcessSync(_latestImage.ToArray(),_cTwCatrix, _pMatrix);
_videoTexture.LoadRawTextureData(image);
_videoTexture.wrapMode = TextureWrapMode.Clamp;
_videoTexture.Apply();
_videoPanelUIRenderer.sharedMaterial.SetTexture("_MainTex", _videoTexture);
注意:ToArray()
是来自System.Linq
的扩展程序,用于创建副本。如果您愿意,可以使用other ways复制数组。
希望这会有所帮助:)