예제 #1
0
 public static GLShader GeometryShaderCascaded()
 {
     return(GLShader.CreateGeometryShader <PerVertexOut> (3,
                                                          CascadedShadowUniforms.MapCount, PrimitiveType.Triangles,
                                                          PrimitiveType.TriangleStrip, () =>
                                                          from p in Shader.Inputs <Primitive> ()
                                                          from u in Shader.Uniforms <Shadows> ()
                                                          from c in Shader.Uniforms <CascadedShadowUniforms> ()
                                                          let viewLight = (!c.viewLightMatrices)[p.gl_InvocationID]
                                                                          select new PerVertexOut[3]
     {
         new PerVertexOut()
         {
             gl_Position = ShadowShaders.ClampToNearPlane(viewLight * p.gl_in[0].gl_Position),
             gl_Layer = p.gl_InvocationID
         },
         new PerVertexOut()
         {
             gl_Position = ShadowShaders.ClampToNearPlane(viewLight * p.gl_in[1].gl_Position),
             gl_Layer = p.gl_InvocationID
         },
         new PerVertexOut()
         {
             gl_Position = ShadowShaders.ClampToNearPlane(viewLight * p.gl_in[2].gl_Position),
             gl_Layer = p.gl_InvocationID
         }
     }
                                                          ));
 }
예제 #2
0
 private static GLShader FragmentShader()
 {
     return(GLShader.Create(ShaderType.FragmentShader, () =>
                            from f in Shader.Inputs <TerrainFragment> ()
                            from u in Shader.Uniforms <Terrain> ()
                            from l in Shader.Uniforms <LightingUniforms> ()
                            from c in Shader.Uniforms <CascadedShadowUniforms> ()
                            let rockColor = FragmentShaders.TextureColor(!u.rockSampler, f.fragTexturePos)
                                            let grassColor = FragmentShaders.TextureColor(!u.grassSampler, f.fragTexturePos)
                                                             let sandColor = FragmentShaders.TextureColor(!u.sandSampler, f.fragTexturePos)
                                                                             let sandBlend = FMath.SmoothStep(2f, 4f, f.height)
                                                                                             let flatColor = grassColor.Mix(sandColor, sandBlend)
                                                                                                             let rockBlend = FMath.SmoothStep(0.8f, 0.9f, f.slope)
                                                                                                                             let terrainColor = rockColor.Mix(flatColor, rockBlend)
                                                                                                                                                let diffuseLight = LightingShaders.LightDiffuseIntensity(
                                (!l.directionalLight).direction,
                                (!l.directionalLight).intensity,
                                f.vertexNormal)
                                                                                                                                                                   let ambient = (!l.globalLighting).ambientLightIntensity
                                                                                                                                                                                 //let shadow = ShadowShaders.PcfShadowMapFactor (f.fragPositionLightSpace, 0.0015f)
                                                                                                                                                                                 //let shadow = ShadowShaders.VarianceShadowMapFactor (new Vec4 (f.vertexPos, 1f))
                                                                                                                                                                                 let shadow = ShadowShaders.CascadedShadowMapFactor(new Vec4(f.vertexPos, 1f), 0.0015f)
                                                                                                                                                                                              let litColor = LightingShaders.GlobalLightIntensity(!l.globalLighting, ambient,
                                                                                                                                                                                                                                                  diffuseLight * shadow, new Vec3(0f), terrainColor, new Vec3(0f))
                                                                                                                                                                                                             select new
     {
         outputColor = litColor.Mix(!u.skyColor, f.visibility)
     }));
 }
예제 #3
0
        private static GLShader FragmentShader()
        {
            return(GLShader.Create
                   (
                       ShaderType.FragmentShader, () =>

                       from f in Shader.Inputs <EntityFragment> ()
                       from u in Shader.Uniforms <Entities> ()
                       from l in Shader.Uniforms <LightingUniforms> ()
                       from c in Shader.Uniforms <CascadedShadowUniforms> ()
                       let samplerNo = (f.fragTexturePos.X / 10f).Truncate()
                                       let fragDiffuse =
                           samplerNo == 0 ? FragmentShaders.TextureColor((!u.samplers)[0], f.fragTexturePos) :
                           samplerNo == 1 ? FragmentShaders.TextureColor((!u.samplers)[1], f.fragTexturePos - new Vec2(10f)) :
                           samplerNo == 2 ? FragmentShaders.TextureColor((!u.samplers)[2], f.fragTexturePos - new Vec2(20f)) :
                           samplerNo == 3 ? FragmentShaders.TextureColor((!u.samplers)[3], f.fragTexturePos - new Vec2(30f)) :
                           f.fragDiffuse
                           let dirLight = LightingShaders.DirLightIntensity(!l.directionalLight, f.fragPosition,
                                                                            f.fragNormal, f.fragShininess)
                                          let totalLight = Control <LightingShaders.DiffuseAndSpecular> .For(0, (!u.pointLights).Length, dirLight,
                                                                                                             (i, total) =>
                                                                                                             (from pl in (!u.pointLights)[i].ToShader()
                                                                                                              let plint = LightingShaders.PointLightIntensity(pl, f.fragPosition, f.fragNormal, f.fragShininess)
                                                                                                                          select new LightingShaders.DiffuseAndSpecular(plint.diffuse + total.diffuse,
                                                                                                                                                                        plint.specular + total.specular))
                                                                                                             .Evaluate())
                                                           let envLight = (!u.diffuseMap).Texture(f.fragNormal)[Coord.x, Coord.y, Coord.z]
                                                                          let ambient = envLight * (!l.globalLighting).ambientLightIntensity
                                                                                        let reflectDiffuse = f.fragReflectivity == 0f ? fragDiffuse :
                                                                                                             fragDiffuse.Mix(LightingShaders.ReflectedColor(!u.diffuseMap, f.fragPosition, f.fragNormal),
                                                                                                                             f.fragReflectivity)
                                                                                                             //let shadow = ShadowShaders.PcfShadowMapFactor (f.fragPositionLightSpace, 0.0015f)
                                                                                                             //let shadow = ShadowShaders.VarianceShadowMapFactor (new Vec4 (f.fragPosition, 1f))
                                                                                                             let shadow = ShadowShaders.CascadedShadowMapFactor(new Vec4(f.fragPosition, 1f), 0.002f)
                                                                                                                          select new
            {
                outputColor = LightingShaders.GlobalLightIntensity(!l.globalLighting, ambient,
                                                                   totalLight.diffuse * shadow, totalLight.specular * shadow, reflectDiffuse, f.fragSpecular)
            }
                   ));
        }