【发布时间】:2017-06-23 21:06:11
【问题描述】:
我正在尝试从给定的网格动态创建广告牌。我正在尝试将 Graphics.DrawMeshNow 用于活动渲染纹理,然后将渲染纹理转换为纹理 2d。这是我对 RenderTexture 如何通过代码工作的理解,即下一个绘图调用被渲染到活动 rt。对于 ReadPixel,它读取活动 rt 的像素。我还尝试将 renderTexture 附加到广告牌,跳过了 texture2d 但没有运气。
var renderTexture = RenderTexture.GetTemporary(width,height,24);
var billboardTexture = new Texture2D(256, 256,TextureFormat.RGB24,false);
Graphics.SetRenderTarget(renderTexture);
Graphics.DrawMeshNow(quad, CurrentActiveGameObject.transform.localPosition,Quaternion.identity);
billboardTexture.ReadPixels(new Rect(0,0,width,height), 0,0);
billboardTexture.Apply();
billboardTexture.name = name + "_billboardTexture";
primMeshRenderer.material.mainTexture = billboardTexture;
当它到达此代码块的最后一行时,billboardTexture 为空。 1)我错过了什么,如何将网格绘制到渲染纹理? 2) 我只能在相机上使用 renderTexture 吗? 3)我该如何测试这个?如何测试 DrawMeshNow 是否正在绘制到 renderTexture?我已经逐步完成了代码,但这并没有给我任何线索,因为我不太确定对象应该包含什么。在我的场景中出现了网格,这表明它仍然会渲染到相机而不是 RenderTexture。
谢谢。
忘了说这是一个编辑器脚本,由菜单/快捷方式执行。
编辑问题,我是否需要在 DrawMeshNow 之后等待 endofFrame 才能使 ReadPixels 工作?
【问题讨论】:
-
我想知道问题是否在于广告牌纹理在方法结束时被 GC'd。您是否尝试过在类范围而不是在方法范围内声明它?
-
我没有,但只是做了,仍然是一个空对象。我在班级级别声明并在同一地点使用 new 创建。
-
您确定 billboardTexture 为空吗?为什么它不抛出 NullReferenceException?你有没有在最后一行代码之后尝试和
Debug.Log(billboardTexture.name);? -
primMeshRenderer.material.mainTexture = billboardTexture;确实会引发 NullRefException。并且脚本运行后primMeshRenderer上的材质为空。我还没有完成 Debug.log(不在那个设备 atm 上),但已经逐步完成,并且创建了 billboardTexture 并获得了一个名称。有一个代码块,我在其中读取所有字节并以 png 格式保存到资产中。 IT 只是一个灰色图像,默认的统一着色器。