C# 统一全息透镜崩溃
我正在编写一个应用程序,它使用Unity和Hololens相机。它工作正常。然后,我更改了一些内容(稍后解释),并在崩溃后出现以下错误: d3d11:未能创建分段2D纹理w=896 h=504 d3dfmt=87[887a0005] d3d11:未能锁定大小为4194304[0x8007000E]的缓冲区1104C69C DrawBuffers()获得了一系列索引,但没有索引缓冲区(文件名: C:\buildslave\unity\build\Runtime/GfxDevice/d3d11/DrawBuffersD3D11.cpp 行:137) 我已经搜索了这些错误,没有适用的解决方案。我希望我能对此有所了解C# 统一全息透镜崩溃,c#,unity3d,crash,hololens,C#,Unity3d,Crash,Hololens,我正在编写一个应用程序,它使用Unity和Hololens相机。它工作正常。然后,我更改了一些内容(稍后解释),并在崩溃后出现以下错误: d3d11:未能创建分段2D纹理w=896 h=504 d3dfmt=87[887a0005] d3d11:未能锁定大小为4194304[0x8007000E]的缓冲区1104C69C DrawBuffers()获得了一系列索引,但没有索引缓冲区(文件名: C:\buildslave\unity\build\Runtime/GfxDevice/d3d11/Dr
我在做什么和我改变了什么 基本上,程序以字节数组
byte[]\u latestImage从摄像机获取一帧代码>
最初,此图像应用于纹理,如中所示
_videoTexture.LoadRawTextureData(_latestImage);
_videoTexture.wrapMode = TextureWrapMode.Clamp;
_videoTexture.Apply();
_videoPanelUIRenderer.sharedMaterial.SetTexture("_MainTex", _videoTexture);
其中,\u videoTexture
是一个纹理2D,\u videoPanelUIRenderer
是一个渲染器
这是正确的。然后我处理数组的最新估计值,将其转换为函数ProcessSync
中的灰色。这也适用于唯一的问题:因为阵列正在被处理(变成灰色),但也被相机自动更新,当应用到纹理中时,它会闪烁,有时是灰色,有时是彩色。但除此之外,没有碰撞
因此,我的下一步是在处理函数开始时克隆该数组,这样我就可以处理这个新数组,并将其应用于纹理,而不会受到来自摄影机的新数据的干扰
所以我做了:
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
}
void ProcessSync(字节[]rawmimage,Matrix4x4 cTwMatrix,Matrix4x4 pMatrix)
{
int-rr,gg,bb;
int p=0;
伊瓦尔;
byte[]image=(byte[])rawmimage.Clone();//正如@Equalsk在注释中提到的,可能会重用原始数组(考虑到数组是引用类型)。可以做的一件事是在传入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;
}
注意:ToArray()
是创建副本的System.Linq
的扩展。如果愿意,可以使用来复制数组
希望这能有所帮助:)我确信,对于.Clone()
返回浅拷贝的数组,即使包含的对象是值类型。可能是rawmimage
被操纵或处理,这导致了它的拷贝问题。你可以改为制作深度拷贝。我不是100%,因此有一条评论;-)
var image = ProcessSync(_latestImage.ToArray(),_cTwCatrix, _pMatrix);
_videoTexture.LoadRawTextureData(image);
_videoTexture.wrapMode = TextureWrapMode.Clamp;
_videoTexture.Apply();
_videoPanelUIRenderer.sharedMaterial.SetTexture("_MainTex", _videoTexture);