void AssembleTextureAtlas(Texture3D target, Texture2D[] srcTextures, int textureSize, int mipCount) { Shader imageShader = ResourceManager.Inst.GetShader("Generic2D"); RenderTarget2D rtTarget = new RenderTarget2D(GFX.Device, textureSize, textureSize, 1, SurfaceFormat.Color); target = new Texture3D(GFX.Device, textureSize, textureSize, srcTextures.Length, mipCount, TextureUsage.AutoGenerateMipMap, SurfaceFormat.Color); Color[] colorBuffer = new Color[textureSize * textureSize]; GFX.Device.SamplerStates[0].MagFilter = TextureFilter.Linear; GFX.Device.SamplerStates[0].MinFilter = TextureFilter.Linear; GFX.Device.SamplerStates[0].MipFilter = TextureFilter.Linear; imageShader.SetupShader(); for (int i = 0; i < srcTextures.Length; i++) { GFX.Device.SetVertexShaderConstant(GFXShaderConstants.VC_INVTEXRES, Vector2.One / new Vector2(srcTextures[i].Width, srcTextures[i].Height)); GFX.Device.Textures[0] = srcTextures[i]; GFX.Device.SetRenderTarget(0, rtTarget); GFXPrimitives.Quad.Render(); GFX.Device.SetRenderTarget(0, null); rtTarget.GetTexture().GetData<Color>(colorBuffer); target.SetData<Color>(colorBuffer, colorBuffer.Length * i, colorBuffer.Length, SetDataOptions.None); } target.GenerateMipMaps(TextureFilter.Linear); }