Quick answer: Query SystemInfo.SupportsRenderTextureFormat (or IsFormatSupported for GraphicsFormat) before creating. Fall back to a baseline format like ARGB32.

A bloom effect uses a half-float RenderTexture. On older Android GPUs, Unity logs “RenderTexture format RGBAHalf is not supported” and the effect renders black.

Capability Check

RenderTextureFormat fmt = RenderTextureFormat.RGBAHalf;
if (!SystemInfo.SupportsRenderTextureFormat(fmt))
{
    fmt = RenderTextureFormat.ARGB32;   // universal fallback
}
var rt = new RenderTexture(width, height, 0, fmt);

Probe first; downgrade gracefully. ARGB32 is supported essentially everywhere.

GraphicsFormat API

using UnityEngine.Experimental.Rendering;

GraphicsFormat gf = GraphicsFormat.R16G16B16A16_SFloat;
if (!SystemInfo.IsFormatSupported(gf, FormatUsage.Render))
{
    gf = GraphicsFormat.R8G8B8A8_UNorm;
}

The modern GraphicsFormat API gives finer control over usage flags (Render, Sample, Blend, LoadStore).

HDR Considerations

If your effect needs HDR range and the device lacks float formats, consider RGB111110Float (smaller, often supported) or accept LDR on those devices via a quality tier.

Device Tiers

Build a quality tier system: high-end gets float bloom, low-end gets a cheaper LDR approximation. Detect once at startup via SystemInfo, store the tier.

Verifying

Run on a low-end Android device. No format warnings. Bloom renders (possibly lower quality). High-end devices still get the float path.

“Never assume a format. Probe with SystemInfo, fall back to baseline.”

Maintain a device matrix in QA. RGBAHalf support is the classic split point between “modern” and “legacy” mobile GPUs.