protected override async Task LoadContent() { await base.LoadContent(); wireframeState = new RasterizerStateDescription(CullMode.Back) { FillMode = FillMode.Wireframe }; simpleEffect = new EffectInstance(new Effect(GraphicsDevice, SpriteEffect.Bytecode)); // TODO GRAPHICS REFACTOR simpleEffect.Parameters.Set(TexturingKeys.Texture0, UVTexture); simpleEffect.UpdateEffect(GraphicsDevice); primitives = new List<GeometricPrimitive>(); // Creates all primitives primitives = new List<GeometricPrimitive> { GeometricPrimitive.Plane.New(GraphicsDevice), GeometricPrimitive.Cube.New(GraphicsDevice), GeometricPrimitive.Sphere.New(GraphicsDevice), GeometricPrimitive.GeoSphere.New(GraphicsDevice), GeometricPrimitive.Cylinder.New(GraphicsDevice), GeometricPrimitive.Torus.New(GraphicsDevice), GeometricPrimitive.Teapot.New(GraphicsDevice), GeometricPrimitive.Capsule.New(GraphicsDevice, 0.5f, 0.3f), GeometricPrimitive.Cone.New(GraphicsDevice) }; view = Matrix.LookAtRH(new Vector3(0, 0, 5), new Vector3(0, 0, 0), Vector3.UnitY); Window.AllowUserResizing = true; }
public override void Start() { base.Start(); customEffect = EffectSystem.LoadEffect("Effect").WaitForResult(); customEffectInstance = new EffectInstance(customEffect); spriteBatch = new SpriteBatch(GraphicsDevice) { VirtualResolution = new Vector3(1) }; // set fixed parameters once customEffectInstance.Parameters.Set(TexturingKeys.Sampler, samplerState); customEffectInstance.Parameters.Set(EffectKeys.Center, new Vector2(0.5f, 0.5f)); customEffectInstance.Parameters.Set(EffectKeys.Frequency, 40); customEffectInstance.Parameters.Set(EffectKeys.Spread, 0.5f); customEffectInstance.Parameters.Set(EffectKeys.Amplitude, 0.015f); customEffectInstance.Parameters.Set(EffectKeys.InvAspectRatio, GraphicsDevice.Presenter.BackBuffer.Height / (float)GraphicsDevice.Presenter.BackBuffer.Width); // NOTE: Linear-Wrap sampling is not available for non-square non-power-of-two textures on opengl es 2.0 samplerState = SamplerState.New(GraphicsDevice, new SamplerStateDescription(TextureFilter.Linear, TextureAddressMode.Clamp)); // Add Effect rendering to the end of the pipeline var scene = SceneSystem.SceneInstance.Scene; var compositor = ((SceneGraphicsCompositorLayers)scene.Settings.GraphicsCompositor); renderer = new SceneDelegateRenderer(RenderQuad); compositor.Master.Renderers.Add(renderer); }
/// <summary> /// Draws a fullscreen quad with the specified effect and parameters. /// </summary> /// <param name="device">The device.</param> /// <param name="effectInstance">The effect instance.</param> /// <exception cref="System.ArgumentNullException">effect</exception> public static void DrawQuad(this GraphicsContext graphicsContext, EffectInstance effectInstance) { if (effectInstance == null) throw new ArgumentNullException("effectInstance"); // Draw a full screen quad graphicsContext.CommandList.GraphicsDevice.PrimitiveQuad.Draw(graphicsContext, effectInstance); }
/// <summary> /// Initializes a new instance of the <see cref="PrimitiveQuad" /> class. /// </summary> /// <param name="graphicsDevice">The graphics device.</param> /// <param name="effect">The effect.</param> public PrimitiveQuad(GraphicsDevice graphicsDevice) { GraphicsDevice = graphicsDevice; sharedData = GraphicsDevice.GetOrCreateSharedData(GraphicsDeviceSharedDataType.PerDevice, "PrimitiveQuad::VertexBuffer", d => new SharedData(GraphicsDevice)); simpleEffect = new EffectInstance(new Effect(GraphicsDevice, SpriteEffect.Bytecode)); simpleEffect.Parameters.Set(SpriteBaseKeys.MatrixTransform, Matrix.Identity); simpleEffect.UpdateEffect(graphicsDevice); pipelineState = new MutablePipelineState(GraphicsDevice); pipelineState.State.SetDefaults(); pipelineState.State.InputElements = VertexDeclaration.CreateInputElements(); pipelineState.State.PrimitiveType = PrimitiveType; }
protected override async Task LoadContent() { await base.LoadContent(); pipelineState = new MutablePipelineState(GraphicsDevice); var vertices = new Vertex[4]; vertices[0] = new Vertex { Position = new Vector3(-1, -1, 0.5f), TexCoords = new Vector2(0, 0) }; vertices[1] = new Vertex { Position = new Vector3(-1, 1, 0.5f), TexCoords = new Vector2(3, 0) }; vertices[2] = new Vertex { Position = new Vector3(1, 1, 0.5f), TexCoords = new Vector2(3, 3) }; vertices[3] = new Vertex { Position = new Vector3(1, -1, 0.5f), TexCoords = new Vector2(0, 3) }; var indices = new short[] { 0, 1, 2, 0, 2, 3 }; var vertexBuffer = Buffer.Vertex.New(GraphicsDevice, vertices, GraphicsResourceUsage.Default); var indexBuffer = Buffer.Index.New(GraphicsDevice, indices, GraphicsResourceUsage.Default); var meshDraw = new MeshDraw { DrawCount = 4, PrimitiveType = PrimitiveType.TriangleList, VertexBuffers = new[] { new VertexBufferBinding(vertexBuffer, new VertexDeclaration(VertexElement.Position<Vector3>(), VertexElement.TextureCoordinate<Vector2>()), 4) }, IndexBuffer = new IndexBufferBinding(indexBuffer, false, indices.Length), }; mesh = new Mesh { Draw = meshDraw, }; simpleEffect = new EffectInstance(new Effect(GraphicsDevice, SpriteEffect.Bytecode)); simpleEffect.Parameters.Set(TexturingKeys.Texture0, UVTexture); simpleEffect.UpdateEffect(GraphicsDevice); // TODO GRAPHICS REFACTOR //vao = VertexArrayObject.New(GraphicsDevice, mesh.Draw.IndexBuffer, mesh.Draw.VertexBuffers); myDraws = new DrawOptions[3]; myDraws[0] = new DrawOptions { Sampler = GraphicsDevice.SamplerStates.LinearClamp, Transform = Matrix.Multiply(Matrix.Scaling(0.4f), Matrix.Translation(-0.5f, 0.5f, 0f)) }; myDraws[1] = new DrawOptions { Sampler = GraphicsDevice.SamplerStates.LinearWrap, Transform = Matrix.Multiply(Matrix.Scaling(0.4f), Matrix.Translation(0.5f, 0.5f, 0f)) }; myDraws[2] = new DrawOptions { Sampler = SamplerState.New(GraphicsDevice, new SamplerStateDescription(TextureFilter.Linear, TextureAddressMode.Mirror)), Transform = Matrix.Multiply(Matrix.Scaling(0.4f), Matrix.Translation(0.5f, -0.5f, 0f)) }; //var borderDescription = new SamplerStateDescription(TextureFilter.Linear, TextureAddressMode.Border) { BorderColor = Color.Purple }; //var border = SamplerState.New(GraphicsDevice, borderDescription); //myDraws[3] = new DrawOptions { Sampler = border, Transform = Matrix.Multiply(Matrix.Scale(0.3f), Matrix.Translation(-0.5f, -0.5f, 0f)) }; }
/// <summary> /// Initializes a new instance of the <see cref="XenkoEffect"/> class. /// </summary> /// <param name="nativeEffect">The native effect.</param> /// <param name="parameters">The parameters.</param> public XenkoEffect(object nativeEffect, ParameterCollection parameters) : base(nativeEffect) { Parameters = parameters; if (Parameters == null) { Parameters = new ParameterCollection(); } effect = nativeEffect as Effect; if (effect != null) { instance = new EffectInstance(effect, Parameters); } }
protected override async Task LoadContent() { await base.LoadContent(); cubemapSpriteEffect = new EffectInstance(EffectSystem.LoadEffect("CubemapSprite").WaitForResult()); drawEffectContext = RenderContext.GetShared(Services); lamberFilter = new LambertianPrefilteringSH(drawEffectContext); lamberFilterNoCompute = new LambertianPrefilteringSHNoCompute(drawEffectContext); renderSHEffect = new SphericalHarmonicsRendererEffect(); renderSHEffect.Initialize(drawEffectContext); spriteBatch = new SpriteBatch(GraphicsDevice); inputCubemap = Content.Load<Texture>("CubeMap"); outputCubemap = Texture.NewCube(GraphicsDevice, 256, 1, PixelFormat.R8G8B8A8_UNorm, TextureFlags.RenderTarget | TextureFlags.ShaderResource).DisposeBy(this); displayedCubemap = outputCubemap; }
/// <summary> /// Draws a quad. The effect must have been applied before calling this method with pixel shader having the signature float2:TEXCOORD. /// </summary> /// <param name="texture"></param> public void Draw(GraphicsContext graphicsContext, EffectInstance effectInstance) { effectInstance.UpdateEffect(GraphicsDevice); pipelineState.State.RootSignature = effectInstance.RootSignature; pipelineState.State.EffectBytecode = effectInstance.Effect.Bytecode; pipelineState.State.BlendState = BlendStates.Default; pipelineState.State.Output.CaptureState(graphicsContext.CommandList); pipelineState.Update(); graphicsContext.CommandList.SetPipelineState(pipelineState.CurrentState); // Apply the effect effectInstance.Apply(graphicsContext); Draw(graphicsContext.CommandList); }
protected override async Task LoadContent() { await base.LoadContent(); var view = Matrix.LookAtRH(new Vector3(2,2,2), new Vector3(0, 0, 0), Vector3.UnitY); var projection = Matrix.PerspectiveFovRH((float)Math.PI / 4.0f, (float)GraphicsDevice.Presenter.BackBuffer.ViewWidth / GraphicsDevice.Presenter.BackBuffer.ViewHeight, 0.1f, 100.0f); worldViewProjection = Matrix.Multiply(view, projection); geometry = GeometricPrimitive.Cube.New(GraphicsDevice); simpleEffect = new EffectInstance(new Effect(GraphicsDevice, SpriteEffect.Bytecode)); simpleEffect.Parameters.Set(TexturingKeys.Texture0, UVTexture); simpleEffect.UpdateEffect(GraphicsDevice); // TODO DisposeBy is not working with device reset offlineTarget0 = Texture.New2D(GraphicsDevice, 512, 512, PixelFormat.R8G8B8A8_UNorm, TextureFlags.ShaderResource | TextureFlags.RenderTarget).DisposeBy(this); offlineTarget1 = Texture.New2D(GraphicsDevice, 512, 512, PixelFormat.R8G8B8A8_UNorm, TextureFlags.ShaderResource | TextureFlags.RenderTarget).DisposeBy(this); offlineTarget2 = Texture.New2D(GraphicsDevice, 512, 512, PixelFormat.R8G8B8A8_UNorm, TextureFlags.ShaderResource | TextureFlags.RenderTarget).DisposeBy(this); depthBuffer = Texture.New2D(GraphicsDevice, 512, 512, PixelFormat.D16_UNorm, TextureFlags.DepthStencil).DisposeBy(this); width = GraphicsDevice.Presenter.BackBuffer.ViewWidth; height = GraphicsDevice.Presenter.BackBuffer.ViewHeight; }
private void RenderCubeMap(RenderDrawContext context) { if (displayedViews == null || spriteBatch == null) return; spriteEffect = new EffectInstance(EffectSystem.LoadEffect("SpriteEffect").WaitForResult()); var size = new Vector2(screenSize.X / 3f, screenSize.Y / 4f); context.CommandList.SetRenderTargetAndViewport(null, GraphicsDevice.Presenter.BackBuffer); context.CommandList.Clear(GraphicsDevice.Presenter.BackBuffer, Color.Green); spriteBatch.Begin(GraphicsContext, SpriteSortMode.Texture, spriteEffect); spriteBatch.Draw(displayedViews[1], new RectangleF(0, size.Y, size.X, size.Y), Color.White); spriteBatch.Draw(displayedViews[2], new RectangleF(size.X, 0f, size.X, size.Y), Color.White); spriteBatch.Draw(displayedViews[4], new RectangleF(size.X, size.Y, size.X, size.Y), Color.White); spriteBatch.Draw(displayedViews[3], new RectangleF(size.X, 2f * size.Y, size.X, size.Y), Color.White); spriteBatch.Draw(displayedViews[5], new RectangleF(size.X, 3f * size.Y, size.X, size.Y), null, Color.White, 0f, Vector2.Zero, SpriteEffects.FlipVertically); spriteBatch.Draw(displayedViews[0], new RectangleF(2f * size.X, size.Y, size.X, size.Y), Color.White); spriteBatch.End(); }
private void UpdateCurrentEffect(EffectBase effect) { EffectInstance effectInstance = effect != null ? effect.GetNativeEffect() as EffectInstance : null; if (effectInstance != null) { if (currentActiveEffect != null) { activeEffects.Push(currentActiveEffect); } currentActiveEffect = effectInstance; } if (currentActiveEffect == null && activeEffects.Count > 0) { currentActiveEffect = activeEffects.Pop(); } }
/// <summary> /// Ends the clipped rendering /// </summary> public override void EndClipped(bool endEffect = false) { isClipped = false; isSpriteRenderInProgress = false; if (endEffect) { currentActiveEffect = null; } else { activeEffects.Push(currentActiveEffect); currentActiveEffect = null; } spriteBatch.End(); clipRectanges.Pop(); }
/// <summary> /// Initializes a new instance of the <see cref="XenkoGeometryBuffer"/> class. /// </summary> public XenkoGeometryBuffer() : base() { effect = new EffectInstance(new Effect(XenkoRenderer.GraphicsDevice, SpriteEffect.Bytecode)); effect.UpdateEffect(XenkoRenderer.GraphicsDevice); }
private EffectInstance GetOrCreatePickingSpriteEffect() { return pickingSpriteEffect ?? (pickingSpriteEffect = new EffectInstance(RenderSystem.EffectSystem.LoadEffect("SpritePicking").WaitForResult())); }
private EffectInstance GetOrCreateSelectedSpriteEffect() { return selectedSpriteEffect ?? (selectedSpriteEffect = new EffectInstance(RenderSystem.EffectSystem.LoadEffect("SelectedSprite").WaitForResult())); }