首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单位Hololens破裂

单位Hololens破裂
EN

Stack Overflow用户
提问于 2017-11-17 09:47:39
回答 1查看 697关注 0票数 3

我正在编写一个使用相机的应用程序,使用。工作正常。然后,我更改了一些内容(稍后解释),并在崩溃后得到以下错误:

d3d11:未能创建暂存2D纹理w=896 h=504 d3dfmt=87 887a0005 d3d11:未能锁定大小为4194304 0x8007000E的缓冲区1104C69C。 C:\buildslave\unity\build\Runtime/GfxDevice/d3d11/DrawBuffersD3D11.cpp ()得到一系列索引,但没有索引缓冲区(文件名:DrawBuffers行: 137)

我一直在寻找这些错误,没有适用的解决方案。我希望我能对这件事有一些见解。

我在做什么我改变了什么

基本上,程序从摄像机中获得了一个字节数组( byte[] _latestImage; )的帧。

最初,此图像被应用于纹理,如

代码语言:javascript
复制
_videoTexture.LoadRawTextureData(_latestImage);
_videoTexture.wrapMode = TextureWrapMode.Clamp;
_videoTexture.Apply();
_videoPanelUIRenderer.sharedMaterial.SetTexture("_MainTex", _videoTexture);

其中_videoTexture是Texture2D,_videoPanelUIRenderer是渲染器。

这个很好用。然后,我处理数组_latestImage,将其转换为ProcessSync函数中的灰色。这也适用于唯一的问题:因为数组正在被处理(变成灰色),但也是自动更新的相机,当应用到一个纹理,它闪烁,有时灰色,有时在颜色。但除此之外,没有撞车。

所以我的下一步是在处理函数开始时克隆这个数组,这样我就可以处理这个新的数组,并将它应用到一个纹理中,而不受来自摄像机的新数据的干扰。

所以我做了:

代码语言:javascript
复制
 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
}

当我应用这个程序时,应用程序工作得很好,并且我可以看到,经过一段时间之后,我得到了灰色image...but,它与上面的消息一起崩溃了。

我的图像是896x504所以我猜

d3d11:未能创建暂存2D纹理w=896 h=504 d3dfmt=87 887a0005

这意味着Texture2D在某种程度上没有被创建,但为什么?当视频模式被初始化时,我的纹理只创建一次,所以我不明白为什么会发生这种情况。

我想这个错误可能与我克隆图像有关。这里有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-17 10:20:23

正如@Equalsk在注释中提到的那样,可能存在重用原始数组的可能性(考虑到array是引用类型)。您可以做的一件事是在传入ProcessSync()之前创建数组的副本,这样就不可能在方法中使用原始指针。

还有一件事我建议:方法应该有单一的责任(返回已处理的数组)。然后,生成的byte[]应该应用于纹理。

代码语言:javascript
复制
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;
}

然后按以下方式使用:

代码语言:javascript
复制
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复制数组。

希望这会有所帮助:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47347631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档