Я использую эффект изображения для преобразования карты глубины ортогональной камеры c в пользовательскую карту теней.
Эта текстура затем передается на основную камеру для рендеринга.
Код для пользовательской камеры довольно прост:
[ExecuteInEditMode, ImageEffectAllowedInSceneView]
[RequireComponent(typeof(Camera))]
public class ShadowMaster : MonoBehaviour
{
public Material material;
public Camera shadowCamera;
public bool updateInEditor = true;
public bool updateInGame = true;
void Start() {
shadowCamera = GetComponent<Camera>();
shadowCamera.enabled = false;
EditorApplication.playModeStateChanged += HandleOnPlayModeChanged;
}
[ImageEffectOpaque]
void OnRenderImage (RenderTexture src, RenderTexture dest) {
src.DiscardContents(true, false);
if (material)
Graphics.Blit (src, dest, material);
else
Graphics.Blit (src, dest);
}
void LateUpdate() {
if ((Application.isPlaying == true && updateInGame)
|| (Application.isPlaying == false && updateInEditor))
{
shadowCamera.Render();
}
}
public void SetMaterial(Material src)
{
material = src;
}
void HandleOnPlayModeChanged(PlayModeStateChange mode)
{
if (mode == PlayModeStateChange.EnteredEditMode || mode == PlayModeStateChange.EnteredPlayMode)
{
shadowCamera.Render();
}
}
}
Моя проблема в том, что теневая камера по-прежнему отображает всю непрозрачную геометрию после прохождения карты глубины и до эффекта изображения, что совершенно бесполезно, так как только глубина используется.
Я пытался использовать RenderTexture.DiscardContent
, но если он что-то делает, он не отображается в отладчике кадров. Моя проблема в том, что кроме вызова этого аргумента src
в OnRenderImage
, я не знаю, как получить доступ к фактическому RenderTexture
, используемому до эффекта, а не к цели RenderTexture
, в которой хранится карта теней.
Точно так же, если я удаляю буфер глубины окончательной текстуры рендеринга, первая текстура рендеринга также не имеет никакой информации о глубине, отрисовывает объекты не по порядку и не сохраняет никакой информации о глубине, даже если для depthTextureMode
установлено значение глубина.