public static bool RequiresResolve(ITextureProducer texture) { return(texture.GetTextureAlphaPacking() != AlphaPacking.None || texture.RequiresVerticalFlip() || texture.GetTextureStereoPacking() != StereoPacking.None || texture.GetTextureCount() > 1 ); }
public static RenderTexture ResolveVideoToRenderTexture(Material resolveMaterial, RenderTexture targetTexture, ITextureProducer texture, ResolveFlags flags, ScaleMode scaleMode = ScaleMode.StretchToFill) { int targetWidth = texture.GetTexture(0).width; int targetHeight = texture.GetTexture(0).height; GetResolveTextureSize(texture.GetTextureAlphaPacking(), texture.GetTextureStereoPacking(), StereoEye.Left, ref targetWidth, ref targetHeight); if (targetTexture) { bool sizeChanged = (targetTexture.width != targetWidth || targetTexture.height != targetHeight); if (sizeChanged) { RenderTexture.ReleaseTemporary(targetTexture); targetTexture = null; } } if (!targetTexture) { RenderTextureReadWrite readWrite = ((flags & ResolveFlags.ColorspaceSRGB) == ResolveFlags.ColorspaceSRGB) ? RenderTextureReadWrite.sRGB : RenderTextureReadWrite.Linear; targetTexture = RenderTexture.GetTemporary(targetWidth, targetHeight, 0, RenderTextureFormat.ARGB32, readWrite); } // Set target mipmap generation support { bool requiresMipmap = (flags & ResolveFlags.Mipmaps) == ResolveFlags.Mipmaps; bool requiresRecreate = (targetTexture.IsCreated() && targetTexture.useMipMap != requiresMipmap); if (requiresRecreate) { targetTexture.Release(); } if (!targetTexture.IsCreated()) { targetTexture.useMipMap = targetTexture.autoGenerateMips = requiresMipmap; targetTexture.Create(); } } // Render resolve blit // TODO: combine these two paths into a single material blit { bool prevSRGB = GL.sRGBWrite; GL.sRGBWrite = targetTexture.sRGB; RenderTexture prev = RenderTexture.active; if (scaleMode == ScaleMode.StretchToFill) { Graphics.Blit(texture.GetTexture(0), targetTexture, resolveMaterial); } else { RenderTexture.active = targetTexture; bool partialAreaRender = (scaleMode == ScaleMode.ScaleToFit); if (partialAreaRender) { GL.Clear(false, true, Color.black); } VideoRender.DrawTexture(new Rect(0f, 0f, targetTexture.width, targetTexture.height), texture.GetTexture(0), scaleMode, texture.GetTextureAlphaPacking(), resolveMaterial); } RenderTexture.active = prev; GL.sRGBWrite = prevSRGB; } return(targetTexture); }