public void GenerateBillboardTextures(IEnumerable <Texture> textures) { _logger.Information($"Generating billboard textures."); foreach (var tex in textures) { var word = GenerateBillboardText(); var color = _billboardColors[_random.Next(_billboardColors.Count)]; using (var text = new Textbox("Consolas") .WithText(word, new Vector2(), 1.5f) .WithHue(color.X) .WithSaturation(color.Y) .WithValue(color.Z)) using (var renderer = new Renderer.Renderer()) using (var backbufferRenderer = new BackBufferRenderer(_logger, tex, tex.Width, tex.Height, false)) { renderer.BeforeRender = () => { GL.Enable(EnableCap.Blend); }; renderer.AfterRender = () => { GL.Disable(EnableCap.Blend); }; renderer.AddToScene(text.Text); backbufferRenderer.RenderToTexture(renderer, _projectionMatrix, Matrix4.Identity); if (text.CursorAdvance > tex.Width) { _logger.Warning($"The billboard text is wider than the texture width! ({word})"); } } } }
public Game( IAppConfig config, ILogger logger, ICamera camera, IWorld world, OpenGlContext context, IRenderer renderer, IRenderer ndcRenderer, IRenderer skyboxRenderer, ISkybox skybox) { _camera = camera; _logger = logger; _config = config; _title = config.WindowTitle; _context = context; ConfigureContext(); _skybox = skybox; _world = world; GL.Enable(EnableCap.DepthTest); GL.Enable(EnableCap.CullFace); GL.CullFace(CullFaceMode.Back); GL.FrontFace(FrontFaceDirection.Cw); GL.ClearColor(Color4.Green); GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); _renderer = renderer; _ndcRenderer = ndcRenderer; _skyboxRenderer = skyboxRenderer; _skyboxRenderer.BeforeRender = () => { GL.DepthFunc(DepthFunction.Lequal); GL.CullFace(CullFaceMode.Front); }; _skyboxRenderer.AfterRender = () => { GL.CullFace(CullFaceMode.Back); }; _skyboxRenderer.AddToScene(skybox); _traffic = _world.Traffic; _renderer.AddToScene(_traffic); _renderer.AddToScene(_world.Renderables); _backbufferTexture = new Texture(_config.ResolutionWidth, config.ResolutionHeight); _worldRenderer = new BackBufferRenderer( _logger, _backbufferTexture, _config.ResolutionWidth, _config.ResolutionHeight, useDepthBuffer: true); _postprocessTexture = new Texture(_config.ResolutionWidth, _config.ResolutionHeight); _postprocessPipeline = new PostprocessPipeline(_logger, _config, _worldRenderer.Texture, _postprocessTexture); _fullscreenShader = new Shader("vs.vert", "fs.frag"); _fullscreenShader.SetUniformValue("tex", new IntUniform { Value = 0 }); _ndcTexture = _postprocessTexture; var fullScreenQuad = new FullScreenQuad(new[] { _ndcTexture }, _fullscreenShader); _ndcRenderer.AddToScene(fullScreenQuad); }