Итак, я создаю стелс-игру, и хотя использование теневого буфера с камерой и получение пикселей сработало, это не очень эффективно при свете под определенным углом, и это чрезвычайно дорого в Unity. Ищу способ определить насколько освещен плеер через шейдер, правда я не программист и шейдеры никогда не трогал. Я искал несколько месяцев, но не нашел значения, и все просто используют триггеры, которые не действуют в этой игре. Я пытаюсь сделать что-то похожее на игры Thief2 или Splinter Cell. Я знаю о raycasts, однако они недостаточно точны.
Итак, как мне определить, насколько освещен плеер, чтобы получить соответствующий градиент?
Вот код, который я пока использую для сбора света.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShadowBufferScript : MonoBehaviour {
public RenderTexture shadowBuffer;
Texture2D tex2d;
public float percentageHidden;
public float relativeLuminance;
void Start()
{
tex2d = new Texture2D (shadowBuffer.width, shadowBuffer.height, TextureFormat.RGB24, false);
}
void FixedUpdate ()
{
tex2d = new Texture2D (shadowBuffer.width, shadowBuffer.height, TextureFormat.RGB24, false);
RenderTexture.active = shadowBuffer;
tex2d.ReadPixels (new Rect (0, 0, shadowBuffer.width, shadowBuffer.height), 0, 0);
tex2d.Apply ();
Color shadowBufferColor = tex2d.GetPixel (0, 0);
relativeLuminance = shadowBufferColor.r * 0.2126f + shadowBufferColor.g * 0.7152f + shadowBufferColor.b * 0.0722f;
percentageHidden = relativeLuminance * 100;
}
}