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)); } }
private Shadows(GLProgram program, bool cascaded) : base(program) { _cascaded = cascaded; if (_cascaded) { csmUniforms = new CascadedShadowUniforms(program); } else { shadowUniforms = new ShadowUniforms(program); } }
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); } }
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); } }
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)); }
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)); }
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]); } } }