Unity のレンダリング エンジンがよくわからないと思います。
RenderTexture を使用してスクリーンショットを生成します (後で管理する必要があります)。
screenshotRenderTexture = new RenderTexture(screenshot.width, screenshot.height, depthBufferBits, RenderTextureFormat.Default);
screenshotRenderTexture.Create();
RenderTexture currentRenderTexture = RenderTexture.active;
RenderTexture.active = screenshotRenderTexture;
Camera[] cams = Camera.allCameras;
System.Array.Sort(
cams,
delegate(Camera cam1, Camera cam2)
{
// It's easier than write float to int conversion that won't floor
// depth deltas under 1 to zero and will correctly work with NaNs
if (cam1.depth < cam2.depth)
return -1;
else if (cam1.depth > cam2.depth)
return 1;
else return 0;
}
);
foreach(Camera cam in cams)
{
cam.targetTexture = screenshotRenderTexture;
cam.Render();
cam.targetTexture = null;
}
screenshot.ReadPixels(new Rect(0, 0, textureWidth, textureHeight), 0, 0);
screenshot.Apply();
RenderTexture.active = currentRenderTexture;
ただし、depthBufferBits が 0 の場合、レンダリングの結果、あらゆる種類の z バッファ バグ (間違った順序でレンダリングされるもの) が発生します。
一般的な意味での深度バッファとは何かを理解しています。しかし、私が理解していないのは、RenderTexture を使用して個々のカメラのレンダリング結果を結合する場合、なぜ深度バッファーが必要なのですか? この抽象化は正確にはどのように機能しますか? カメラは独自に画像を作成し、それを RenderTexture に渡しますか、それともカメラは RenderTexture の深度バッファを使用しますか? 私が経験したバグのため、後者のようです(間違った順序のものはすべて同じカメラでレンダリングされるため、問題は1つのカメラ内のものを注文することであり、異なるカメラ間のものを注文することではありません)が、同時にこれらの抽象化が C# レベルでどのように構造化されているかという常識と矛盾する場合があります。
そして最後に、これで通常のレンダリングに使用されるデフォルトの深度バッファをどうにかして使用できますか? モバイル デバイスでの 16 ビット/ピクセルはかなり苦痛だからです。
アップデート:
これが私がやろうとしたことです:
screenshotRenderTexture = new RenderTexture(
screenshot.width,
screenshot.height,
0,
RenderTextureFormat.Default
);
screenshotRenderTexture.Create();
RenderBuffer currentColorBuffer = Graphics.activeColorBuffer;
Graphics.SetRenderTarget(screenshotRenderTexture.colorBuffer, Graphics.activeDepthBuffer);
yield return new WaitForEndOfFrame();
Graphics.SetRenderTarget(currentColorBuffer, Graphics.activeDepthBuffer);
そして、ここに私が得たものがあります:
SetRenderTarget can only mix color & depth buffers from RenderTextures. You're trying to set depth buffer from the screen.
UnityEngine.Graphics:SetRenderTarget(RenderBuffer, RenderBuffer)
<ScreenshotTaking>c__Iterator21:MoveNext() (at Assets/Scripts/Managers/ScreenshotManager.cs:126)
画面の深度バッファと RenderTexture のカラー バッファを混合できないのはなぜですか?