2017-05-28 256 views
0

我想从给定的网格动态创建一个广告牌。我正在尝试使用Graphics.DrawMeshNow来执行此活动渲染纹理,然后将renderTexture转换为纹理2d。这是我对通过代码执行RenderTexture的理解,下一个绘制调用将呈现给活动的rt。对于ReadPixel,它读取活动rt的像素。我也尝试将renderTexture附加到广告牌上,跳过了texture2d但没有运气。渲染网格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为null。 1)我错过了什么,我如何绘制一个网格到renderTexture? 2)我只能用相机使用renderTexture吗? 3)我怎么测试这个?我如何测试DrawMeshNow正在绘制到renderTexture?我已经完成了代码,但没有给出任何线索,因为我不太确定这些对象应该包含哪些内容。在我的场景中出现了网格,这意味着它仍然渲染到相机,而不是RenderTexture。

谢谢。

忘了提及这是一个编辑器脚本,并通过菜单/快捷方式执行。

编辑问题在DrawMeshNow之后,为了使ReadPixels正常工作,是否需要等待endofFrame?

+0

我不知道问题是广告牌纹理在方法的结尾处​​是GC'd。你是否试过在类作用域而不是方法作用域中声明它? – Draco18s

+0

我没有,但只是做了,仍然是一个空对象。我在课堂上申报,并在同一地点以新课程进行创作。 – mushcraft

+0

你确定billboardTexture为空吗?为什么不抛出NullReferenceException?您是否尝试过'Debug.Log(billboardTexture.name);'在最后一行代码之后? –

回答

0

给我的文档表明您应该能够从Temporary renderTexture中读取像素,ReadPixel。但也许一个临时renderTexture从来没有'积极'?因为我从来没有能够从Temporary rendertexture中读取像素,所以最后我创建了第二个摄影机,为摄影机分配了一个renderTexture对象并使其处于活动状态,然后我从该renderTexture中读取了像素。