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})");
                            }
                        }
            }
        }
예제 #2
0
        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);
        }