{"record":{"id":"a65231db93c72572","repo":"stride3d/stride","slug":"only-render-targets-are-supported-as-output","errorCode":null,"errorMessage":"Only render targets are supported as output","messagePattern":"Only render targets are supported as output","errorType":"exception","errorClass":"NotSupportedException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Rendering/Rendering/ComputeEffect/GGXPrefiltering/RadiancePrefilteringGGXNoCompute.cs","lineNumber":82,"sourceCode":"            {\n                if (value > 1024)\n                    throw new ArgumentOutOfRangeException(nameof(value));\n\n                if (!MathUtil.IsPow2(value))\n                    throw new ArgumentException(\"The provided value should be a power of 2\");\n\n                samplingsCount = Math.Max(1, value);\n            }\n        }\n\n        protected override void DrawCore(RenderDrawContext context)\n        {\n            var output = PrefilteredRadiance;\n            if (output == null || (output.ViewDimension != TextureDimension.Texture2D && output.ViewDimension != TextureDimension.TextureCube) || output.ArraySize != 6)\n                throw new NotSupportedException(\"Only array of 2D textures are currently supported as output\");\n\n            if (!output.IsRenderTarget)\n                throw new NotSupportedException(\"Only render targets are supported as output\");\n\n            var input = RadianceMap;\n            if (input == null || input.ViewDimension != TextureDimension.TextureCube)\n                throw new NotSupportedException(\"Only cubemaps are currently supported as input\");\n\n            var roughness = 0f;\n            var faceCount = output.ArraySize;\n            var levelSize = new Int2(output.Width, output.Height);\n            var mipCount = MipmapGenerationCount == 0 ? output.MipLevelCount : MipmapGenerationCount;\n\n            for (int mipLevel = 0; mipLevel < mipCount; mipLevel++)\n            {\n                for (int faceIndex = 0; faceIndex < faceCount; faceIndex++)\n                {\n                    using var outputView = output.ToTextureView(ViewType.Single, faceIndex, mipLevel);\n                    var inputLevel = MathUtil.Log2(input.Width / output.Width);\n                    if (mipLevel == 0 && DoNotFilterHighestLevel)\n                    {","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Rendering/Rendering/ComputeEffect/GGXPrefiltering/RadiancePrefilteringGGXNoCompute.cs#L64-L100","documentation":"RadiancePrefilteringGGXNoCompute renders into PrefilteredRadiance using raster passes, so the output must have been created with TextureFlags.RenderTarget (IsRenderTarget). Otherwise DrawCore throws NotSupportedException.","triggerScenarios":"Passing a texture created only with ShaderResource/unordered-access flags as PrefilteredRadiance, e.g. a staging or compute-only texture.","commonSituations":"Creating the prefiltered mip chain with TextureFlags.ShaderResource only for compute-based workflows, then feeding it to the NoCompute (raster) variant.","solutions":["Recreate the texture with TextureFlags.RenderTarget included.","Or switch to the compute-based RadiancePrefilteringGGX effect which does not need a render target.","Verify output.IsRenderTarget before drawing."],"exampleFix":"// before\nvar tex = Texture.New2D(device, 256, 256, PixelFormat.R16G16B16A16_Float, TextureFlags.ShaderResource, 6, 0);\n// after\nvar tex = Texture.New2D(device, 256, 256, PixelFormat.R16G16B16A16_Float, TextureFlags.ShaderResource | TextureFlags.RenderTarget, 6, 0);","handlingStrategy":"validation","validationCode":"if (output != null && !output.IsRenderTarget) throw new ArgumentException(\"PrefilteredRadiance must be created with TextureFlags.RenderTarget\");","typeGuard":"bool IsRenderTarget(Texture t) => t != null && t.IsRenderTarget;","tryCatchPattern":"try { prefilter.Draw(context); } catch (NotSupportedException ex) { log.Error(ex, \"Recreate PrefilteredRadiance with TextureFlags.RenderTarget\"); }","preventionTips":["Include TextureFlags.RenderTarget in every texture used as a draw output.","Centralize IBL texture creation in one helper with correct flags.","Unit-test texture descriptors in headless mode before rendering."],"tags":["stride","rendering","render-target","unsupported-operation"],"backgroundTag":"invalid-argument-value","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}