public Texture2D Generate2DNoise(NoiseParameters noiseParams, int width, int height, int mipCount) { Vector2 invRes = Vector2.One / new Vector2(width, height); noise2DShader.SetupShader(); GFX.Device.SetVertexShaderConstant(0, invRes); GFX.Device.SetPixelShaderConstant(0, invRes); GFX.Device.SetPixelShaderConstant(1, new Vector4(noiseParams.Amplitude, noiseParams.Frequency, noiseParams.Persistance, noiseParams.Octaves)); GFX.Device.Textures[0] = ComputeRandomTexture(width / 2, height / 2); RenderTarget2D rtNoise = new RenderTarget2D(GFX.Device, width, height, 1, SurfaceFormat.Color); DepthStencilBuffer dsOld = GFX.Device.DepthStencilBuffer; GFX.Device.DepthStencilBuffer = GFX.Inst.dsBufferLarge; GFX.Device.SetRenderTarget(0, rtNoise); GFXPrimitives.Quad.Render(); GFX.Device.SetRenderTarget(0, null); GFX.Device.DepthStencilBuffer = dsOld; Color[] colorData = new Color[width * height]; rtNoise.GetTexture().GetData<Color>(colorData); Texture2D noiseTexture = new Texture2D(GFX.Device, width, height, mipCount, TextureUsage.None, SurfaceFormat.Color); noiseTexture.SetData<Color>(colorData); noiseTexture.GenerateMipMaps(TextureFilter.GaussianQuad); return noiseTexture; }
public WaterRenderer(ContentManager contentManager, Scene scene, Camera camera) : base(contentManager) { effect = Content.Load<Effect>("water"); bumpTexture = Content.Load<Texture2D>("water_texture"); bumpTexture.GenerateMipMaps(TextureFilter.Anisotropic); this.camera = camera; var vertices = new VertexPositionTexture[6 * scene.Water.WaterQuads.Count]; int idx = 0; foreach (var quad in scene.Water.WaterQuads) { vertices[idx++] = new VertexPositionTexture(new Vector3(quad.Xmin, quad.Level, -quad.Ymin), new Vector2(quad.Xmin, -quad.Ymin) / WaterTextureCoordsDivisor); vertices[idx++] = new VertexPositionTexture(new Vector3(quad.Xmax, quad.Level, -quad.Ymin), new Vector2(quad.Xmax, -quad.Ymin) / WaterTextureCoordsDivisor); vertices[idx++] = new VertexPositionTexture(new Vector3(quad.Xmin, quad.Level, -quad.Ymax), new Vector2(quad.Xmin, -quad.Ymax) / WaterTextureCoordsDivisor); vertices[idx++] = new VertexPositionTexture(new Vector3(quad.Xmax, quad.Level, -quad.Ymin), new Vector2(quad.Xmax, -quad.Ymin) / WaterTextureCoordsDivisor); vertices[idx++] = new VertexPositionTexture(new Vector3(quad.Xmax, quad.Level, -quad.Ymax), new Vector2(quad.Xmax, -quad.Ymax) / WaterTextureCoordsDivisor); vertices[idx++] = new VertexPositionTexture(new Vector3(quad.Xmin, quad.Level, -quad.Ymax), new Vector2(quad.Xmin, -quad.Ymax) / WaterTextureCoordsDivisor); } vertexBuffer = new VertexBuffer(Device, vertices.Length * VertexPositionTexture.SizeInBytes, BufferUsage.None); vertexBuffer.SetData(vertices); vertexDeclaration = new VertexDeclaration(Device, VertexPositionTexture.VertexElements); primitivesToDraw = scene.Water.WaterQuads.Count * 2; projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, Device.Viewport.AspectRatio, Config.Instance.Rendering.NearClippingDistance, Config.Instance.Rendering.FarClippingDistance); }
private void CopyTextureToRenderTarget(Texture2D src, RenderTarget2D rt, ref Texture2D dest) { var dsb = GraphicsDevice.DepthStencilBuffer; GraphicsDevice.DepthStencilBuffer = null; GraphicsDevice.SetRenderTarget(0, rt); spriteBatch.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.None); spriteBatch.Draw(src, new Rectangle(0, 0, src.Width, src.Height), Color.White); spriteBatch.End(); GraphicsDevice.SetRenderTarget(0, null); GraphicsDevice.DepthStencilBuffer = dsb; dest = rt.GetTexture(); dest.GenerateMipMaps(TextureFilter.Linear); }