示例#1
0
        public Entities(GLProgram program, SceneGraph scene)
            : base(program)
        {
            var numPointLights = 0;
            var plights        = new LightingShaders.PointLight[4];

            using (program.Scope())
            {
                foreach (var pointLight in scene.Root.Traverse().OfType <PointLight> ())
                {
                    plights[numPointLights++] = new LightingShaders.PointLight
                    {
                        position             = pointLight.Position,
                        intensity            = pointLight.Intensity,
                        linearAttenuation    = pointLight.LinearAttenuation,
                        quadraticAttenuation = pointLight.QuadraticAttenuation
                    };
                }
                pointLights &= plights;

                var samp = new Sampler2D[4];
                for (int i = 0; i < samp.Length; i++)
                {
                    samp[i] = new Sampler2D(i + 1).LinearFiltering().ClampToEdges(Axes.All);
                }
                samplers   &= samp;
                diffuseMap &= new SamplerCube(5).LinearFiltering().ClampToEdges(Axes.All);

                lighting   = new LightingUniforms(program, scene);
                transforms = new TransformUniforms(program);
                shadows    = new CascadedShadowUniforms(program,
                                                        new Sampler2DArray(0).LinearFiltering().ClampToEdges(Axes.All));
            }
        }
示例#2
0
 private Shadows(GLProgram program, bool cascaded) : base(program)
 {
     _cascaded = cascaded;
     if (_cascaded)
     {
         csmUniforms = new CascadedShadowUniforms(program);
     }
     else
     {
         shadowUniforms = new ShadowUniforms(program);
     }
 }
示例#3
0
        private void Render(Camera camera, CascadedShadowUniforms shadowSource)
        {
            lighting.UpdateDirectionalLight(camera);
            shadows.viewLightMatrices &= !shadowSource.viewLightMatrices;
            //shadows.lightSpaceMatrix &= !shadowSource.lightSpaceMatrix;

            foreach (var mesh in camera.NodesInView <Mesh <EntityVertex> > ())
            {
                Sampler.Bind(!samplers, mesh.Textures);
                transforms.UpdateModelViewAndNormalMatrices(camera.WorldToCamera * mesh.Transform);
                _entityShader.DrawElements(PrimitiveType.Triangles, mesh.VertexBuffer, mesh.IndexBuffer);
                Sampler.Unbind(!samplers, mesh.Textures);
            }
        }
示例#4
0
        private Terrain(GLProgram program, SceneGraph scene, Vec3 skyCol)
            : base(program)
        {
            transforms = new TransformUniforms(program);
            lighting   = new LightingUniforms(program, scene);
            shadows    = new CascadedShadowUniforms(program,
                                                    new Sampler2DArray(0).LinearFiltering().ClampToEdges(Axes.All));

            using (program.Scope())
            {
                skyColor     &= skyCol;
                sandSampler  &= new Sampler2D(1);
                rockSampler  &= new Sampler2D(2);
                grassSampler &= new Sampler2D(3);
            }
        }
示例#5
0
        public static Reaction <Camera> Renderer(SceneGraph sceneGraph, CascadedShadowUniforms shadowSource)
        {
            _entityShader = new GLProgram(
                VertexShader(),
                FragmentShader());
            _entities = new Entities(_entityShader, sceneGraph);

            return(React.By <Camera> (cam => _entities.Render(cam, shadowSource))
                   .BindSamplers(new Dictionary <Sampler, Texture> ()
            {
                { !_entities.shadows.csmShadowMap, sceneGraph.GlobalLighting.ShadowMap },
                { !_entities.diffuseMap, sceneGraph.GlobalLighting.DiffuseMap }
            })
                   .DepthTest()
                   .Culling()
                   .Program(_entityShader));
        }
示例#6
0
        public static Reaction <Camera> Renderer(SceneGraph sceneGraph, Vec3 skyCol,
                                                 CascadedShadowUniforms shadowSource)
        {
            _terrainShader = new GLProgram(VertexShader(), FragmentShader());
            _terrain       = new Terrain(_terrainShader, sceneGraph, skyCol);
            var sandTexture  = LoadTexture("Sand");
            var rockTexture  = LoadTexture("Rock");
            var grassTexture = LoadTexture("Grass");

            return(React.By((Camera cam) => _terrain.Render(cam, shadowSource))
                   .BindSamplers(new Dictionary <Sampler, Texture> ()
            {
                { !_terrain.shadows.csmShadowMap, sceneGraph.GlobalLighting.ShadowMap },
                { !_terrain.sandSampler, sandTexture },
                { !_terrain.rockSampler, rockTexture },
                { !_terrain.grassSampler, grassTexture }
            })
                   .DepthTest()
                   .Culling()
                   .Program(_terrainShader));
        }
示例#7
0
        private void Render(Camera camera, CascadedShadowUniforms shadowSource)
        {
            var worldToCamera = camera.WorldToCamera;

            lighting.UpdateDirectionalLight(camera);
            shadows.viewLightMatrices &= !shadowSource.viewLightMatrices;
            //shadows.lightSpaceMatrix &= !shadowSource.lightSpaceMatrix;

            foreach (var mesh in camera.NodesInView <TerrainMesh <TerrainVertex> > ())
            {
                if (mesh.VertexBuffer != null && mesh.IndexBuffers != null)
                {
                    transforms.UpdateModelViewAndNormalMatrices(worldToCamera * mesh.Transform);
                    var distance = -(worldToCamera * mesh.BoundingBox).Front;
                    var lod      = distance < 100 ? 0 :
                                   distance < 200 ? 1 :
                                   2;
                    _terrainShader.DrawElements(PrimitiveType.TriangleStrip, mesh.VertexBuffer,
                                                mesh.IndexBuffers[lod]);
                }
            }
        }