diff --git a/src/AcDream.App/Rendering/TextureCache.cs b/src/AcDream.App/Rendering/TextureCache.cs index 6d10200..a53dfd7 100644 --- a/src/AcDream.App/Rendering/TextureCache.cs +++ b/src/AcDream.App/Rendering/TextureCache.cs @@ -279,6 +279,38 @@ public sealed unsafe class TextureCache : Wb.ITextureCachePerInstance, IDisposab return tex; } + /// + /// Variant of that uploads pixel data as a 1-layer + /// Texture2DArray. Required by the WB modern rendering path which samples via + /// sampler2DArray in its bindless shader. Pixel data is identical. + /// + private uint UploadRgba8AsLayer1Array(DecodedTexture decoded) + { + uint tex = _gl.GenTexture(); + _gl.BindTexture(TextureTarget.Texture2DArray, tex); + + fixed (byte* p = decoded.Rgba8) + _gl.TexImage3D( + TextureTarget.Texture2DArray, + 0, + InternalFormat.Rgba8, + (uint)decoded.Width, + (uint)decoded.Height, + 1, + 0, + PixelFormat.Rgba, + PixelType.UnsignedByte, + p); + + _gl.TexParameter(TextureTarget.Texture2DArray, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); + _gl.TexParameter(TextureTarget.Texture2DArray, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); + _gl.TexParameter(TextureTarget.Texture2DArray, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat); + _gl.TexParameter(TextureTarget.Texture2DArray, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat); + + _gl.BindTexture(TextureTarget.Texture2DArray, 0); + return tex; + } + public void Dispose() { foreach (var h in _handlesBySurfaceId.Values)