示例#1
0
 public Flag(Vector3 position)
 {
     count++;
     pole = new GameObject();
     flag = new GameObject();
     if (meshPole == null)
     {
         meshPole = new XMesh("data/flagpole.x");
     }
     if (meshFlag == null)
     {
         meshFlag   = new XMesh("data/flag.x");
         flagShader = new ShaderBase("FlagShader", "data/flag.fx");
         flagShader.SetVariable("matWorldViewProj", ShaderBase.ShaderParameters.WorldProjection);
         flagShader.SetVariable("matWorld", ShaderBase.ShaderParameters.World);
         flagShader.SetVariable("vecLightDir", new Vector3(-0.3529871f, 0.8714578f, -0.3405313f));
         flagShader.SetTechnique("TFlag");
     }
     //this.Position = new Microsoft.DirectX.Vector3((count % 2 == 0)?5f:-5f, 0, (count % 2 == 0)?50f:20f);
     this.Position = position;
     pole.Mesh     = meshPole;
     pole.Scale    = new Vector3(2, 2, 2);
     flag.Mesh     = meshFlag;
     flag.Position = new Vector3(0, 2.3f, 0);
     flag.Shader   = flagShader;
     this.AddChild(pole);
     this.AddChild(flag);
     this.Scale = new Microsoft.DirectX.Vector3(2f, 2f, 2f);
     if (!string.IsNullOrEmpty(oldTexture) && !string.IsNullOrEmpty(newTexture))
     {
         meshFlag.ReplaceTexture(oldTexture, newTexture, true);
         flagShader.SetVariable("Texture", meshFlag.GetTexture(0));
     }
 }
示例#2
0
        public void SetSky(string texture, Vector3 sunPosition, Color ambientColor, Color sunlightColor, float terrainAmbient, float terrainSun)
        {
            SetSkyTexture(texture);
            Program.Instance.SunLightColor     = sunlightColor;
            Program.Instance.AmbientLightColor = ambientColor;
            Program.Instance.SunPosition       = sunPosition;
            LensFlare.SunPosition = sunPosition;
            LensFlare.Visible     = sunPosition.Length() > 1f;
            Vector3 sunPosNorm = sunPosition;

            this.terrainAmbient = terrainAmbient;
            this.terrainSun     = terrainSun;
            sunPosNorm.Normalize();
            if (splatShader != null)
            {
                splatShader.SetVariable("sunPosition", sunPosNorm);
                splatShader.SetVariable("ambientFactor", terrainAmbient);
                splatShader.SetVariable("sunFactor", terrainSun);
            }
            Flag.SetSky(sunPosition, ambientColor, sunlightColor, terrainAmbient, terrainSun);
            foreach (Water water in waters)
            {
                water.SetSunPosition(sunPosition);
            }
        }
示例#3
0
 public WindSock()
 {
     count++;
     if (meshWindSock == null)
     {
         meshWindSock = new XMesh("flag.x");
         flagShader   = new ShaderBase("FlagShader", "flag.fx");
         flagShader.SetVariable("matWorldViewProj", ShaderBase.ShaderParameters.WorldProjection);
         flagShader.SetVariable("matWorld", ShaderBase.ShaderParameters.World);
         flagShader.SetTechnique("TVertexShaderOnly");
         //texture = new TextureBase("EuropeFlag.jpg");
         //flagShader.SetVariable("Tex0", texture);
     }
     this.Mesh     = meshWindSock;
     this.Shader   = flagShader;
     this.Scale    = new Microsoft.DirectX.Vector3(1f, 1f, 1f);
     this.Position = new Microsoft.DirectX.Vector3(1, 1, 0);
 }
示例#4
0
        protected void InitializeReflectionShader()
        {
            if (reflectionShader == null)
            {
                reflectionShader = new ShaderBase("reflectionshader", @"data\reflection.fx", false);
                //TextureBase skyBox = new TextureBase(@"data\cubemap.dds");

                if (Reflection.Instance.CubeMap != null)
                {
                    reflectionShader.SetVariable("SkyboxTexture", Reflection.Instance.CubeMap);
                }
                reflectionShader.SetVariable("specular", 0.9f);
                reflectionShader.SetVariable("matWorldViewProj", ShaderBase.ShaderParameters.WorldProjection);
                reflectionShader.SetVariable("matWorld", ShaderBase.ShaderParameters.World);
                Vector3 sunVector = new Vector3(0.3f, 0.9f, 0.4f);
                sunVector.Normalize();
                reflectionShader.SetVariable("vecLightDir", sunVector);
                Vector3 sunColor = new Vector3(1.0f, 1.0f, 1.0f);
                sunColor.Normalize();
                reflectionShader.SetVariable("sunColor", sunColor);
                reflectionShader.SetVariable("light", 1.3f);
                reflectionShader.SetVariable("cameraPosition", ShaderBase.ShaderParameters.CameraPosition);
            }
        }
示例#5
0
        private void Initialize()
        {
            if (parameters.SceneryType == SceneryParameters.SceneryTypeEnum.Photofield)
            {
                if (parameters.HeightMapFile != null)
                {
                    heightMap = new Heightmap(parameters.SceneryFolder + parameters.HeightMapFile,
                                              (float)parameters.HeightMapSize, parameters.HeightMapResolution, parameters.HeightMapResolution);
                    heightMap.MinHeight = parameters.MinimumHeight;
                    heightMap.MaxHeight = parameters.MaximumHeight;
                }
                else
                {
                    heightMap = new Heightmap(1000);
                }
                photoScenery = new PhotoScenery(parameters);
                // Set lighting conditions
                if (definition != null)
                {
                    if (definition.SkyTable.Rows.Count > 0)
                    {
                        DataRow dataRow       = definition.SkyTable.Rows[0];
                        Vector3 ambientVector = (Vector3)dataRow["AmbientLight"];
                        Vector3 sunVector     = (Vector3)dataRow["SunLight"];
                        SetSky(null, (Vector3)dataRow["SunPosition"],
                               Color.FromArgb((int)(255 * ambientVector.X), (int)(255 * ambientVector.Y), (int)(255 * ambientVector.Z)),
                               Color.FromArgb((int)(255 * sunVector.X), (int)(255 * sunVector.Y), (int)(255 * sunVector.Z)),
                               (float)(dataRow["TerrainAmbient"]), (float)(dataRow["TerrainSun"]));
                        lensFlare = new LensFlare();
                    }
                }
            }
            else
            {
                vegetation = new Vegetation(owner);

                ground              = new GameObject();
                heightMap           = new Heightmap(parameters.SceneryFolder + parameters.HeightMapFile, 1000f, 100, 100);
                heightMap.MinHeight = parameters.MinimumHeight;
                heightMap.MaxHeight = parameters.MaximumHeight;
                TerrainMesh sceneryMesh = new TerrainMesh(1.0f, heightMap);
                ground.Mesh = sceneryMesh;

                // Load the detail settings
                currentDetail        = Bonsai.Utils.Settings.GetValue("SceneryDetail", "2");
                dynamicSceneryDetail = Convert.ToInt32(Bonsai.Utils.Settings.GetValue("DynamicScenery", "1"));

                if (currentDetail.Equals("1"))
                {
                    sceneryMesh.Texture = new Bonsai.Objects.Textures.TextureBase(parameters.SplatLowFile);
                }
                else
                {
                    //ground.RotateXAngle = (float)Math.PI / 2;

                    //splatShader = new ShaderBase("splatting", "splatting3.fx");
                    //if (Framework.Instance.DeviceCaps.PixelShaderVersion.Major >= 3)
                    //    splatShader.SetTechnique("TextureSplatting_fx30");
                    //else
                    //    splatShader.SetTechnique("TextureSplatting");

                    splatShader = new ShaderBase("splatting", "splat.fx");
                    splatShader.SetTechnique("TextureSplatting");
                    splatShader.SetVariable("matViewProj", ShaderBase.ShaderParameters.CameraProjection);
                    splatShader.SetVariable("sunPosition", new Vector3(1, 1, 1));
                    splatShader.SetVariable("underwater", 0.0f);
                    splatShader.SetVariable("matWorld", ShaderBase.ShaderParameters.World);
                    splatShader.SetVariable("matInvertTransposeWorld", ShaderBase.ShaderParameters.WorldInvertTranspose);
                    splatShader.SetVariable("cameraPos", ShaderBase.ShaderParameters.CameraPosition);
                    splatShader.SetVariable("nearRepeat", 64.0f);
                    splatShader.SetVariable("farRepeat", 16.0f);
                    splatShader.SetVariable("nearFactor2", 1.0f);
                    splatShader.SetVariable("farFactor2", 1.0f);
                    splatShader.SetVariable("nearFactor3", 1.0f);
                    splatShader.SetVariable("farFactor3", 1.0f);
                    splatShader.SetVariable("nearFactor4", 5.0f);
                    splatShader.SetVariable("farFactor4", 5.0f);
                    splatShader.SetVariable("blendSqDistance", 50f * 50f);
                    splatShader.SetVariable("blendSqWidth", 1.0f / (200f * 200f));
                    TextureBase normalMap = new TextureBase(parameters.NormalMapFile);
                    TextureBase alphaMap  = new TextureBase(parameters.SplatHighFile);
                    //TextureBase grassTexture = new TextureBase("data/grass_zoomout.png");
                    TextureBase grassTexture = new TextureBase(parameters.Texture1File);
                    TextureBase rockTexture  = new TextureBase(parameters.Texture2File);
                    //TextureBase rockNormal = new TextureBase("data/splat_rock_normal.jpg");
                    TextureBase sandTexture     = new TextureBase(parameters.Texture3File);
                    TextureBase concreteTexture = new TextureBase(parameters.Texture4File);

                    splatShader.SetVariable("NormalMapTexture", normalMap);
                    splatShader.SetVariable("AlphaTexture", alphaMap);
                    splatShader.SetVariable("DetailTexture1", grassTexture);
                    splatShader.SetVariable("DetailTexture2", rockTexture);
                    //splatShader.SetVariable("DetailTexture2NormalMap", rockNormal);
                    splatShader.SetVariable("DetailTexture3", sandTexture);
                    splatShader.SetVariable("DetailTexture4", concreteTexture);

                    ground.Shader = splatShader;
                }

                CreateSurroundings();

                // Load the trees
                vegetation.LoadTrees(heightMap, definition);

                // Load the simple trees
                LoadSimpleTrees(definition);

                // Load the simple tall trees
                LoadSimpleTallTrees(definition);

                // Load the simple small trees
                LoadSimpleSmallTrees(definition);

                // Load the scenery objects
                LoadSceneryObjects(definition);

                // Load the windmills
                LoadWindmills(definition);

                // Load the weather
                LoadWeather(definition);

                // Load the dynamic scenery
                if (dynamicSceneryDetail > 0)
                {
                    LoadDynamicScenery(definition);
                }

                // Load the sky
                sky = new GameObject();
                DomeMesh skyDome = new DomeMesh(4500, 16, 16);
                sky.Mesh = skyDome;
                DataRow dataRow = definition.SkyTable.Rows[0];
                foreach (DataRow skyRow in definition.SkyTable.Rows)
                {
                    string skyName = skyRow["Name"].ToString();
                    if (skyName.Equals(Bonsai.Utils.Settings.GetValue("Sky")))
                    {
                        dataRow = skyRow;
                        break;
                    }
                }

                // Load the water
                LoadWater(definition);
                //water = new Water(new Vector3(90, 0, 180), 100f, Bonsai.Objects.Terrain.Water.QualityLevelEnum.Low);

                if (dataRow != null)
                {
                    Vector3 ambientVector = (Vector3)dataRow["AmbientLight"];
                    Vector3 sunVector     = (Vector3)dataRow["SunLight"];
                    SetSky(dataRow["Texture"].ToString(), (Vector3)dataRow["SunPosition"],
                           Color.FromArgb((int)(255 * ambientVector.X), (int)(255 * ambientVector.Y), (int)(255 * ambientVector.Z)),
                           Color.FromArgb((int)(255 * sunVector.X), (int)(255 * sunVector.Y), (int)(255 * sunVector.Z)),
                           (float)(dataRow["TerrainAmbient"]), (float)(dataRow["TerrainSun"]));
                }

                // Apply the ads
                if (Utility.MediaExists("ads/ad1.jpg"))
                {
                    ApplyAds("ad.jpg", "ads/ad1.jpg");
                }
                if (Utility.MediaExists("ads/ad2.jpg"))
                {
                    ApplyAds("ad2.jpg", "ads/ad2.jpg");
                }

                lensFlare = new LensFlare();
            }

#if EDITOR
            // Load the racing pylons
            LoadGates(definition);
#else
            if (Program.Instance.Player != null)
            {
                Program.Instance.Player.Heightmap            = heightMap;
                Program.Instance.Player.DefaultStartPosition = parameters.DefaultStartPosition;
                Program.Instance.Player.WaterStartPosition   = parameters.WaterStartPosition;
            }

            SetWaterCallback(Program.Instance.OnFrameRenderWater);
            // Rerender the reflection
            if (Effects.Reflection.Instance != null)
            {
                Effects.Reflection.Instance.Invalidate();
            }
#endif
        }
示例#6
0
 public override void OnFrameMove(Microsoft.DirectX.Direct3D.Device device, double totalTime, float elapsedTime)
 {
     flagShader.SetVariable("time", (float)-totalTime);
     base.OnFrameMove(device, totalTime, elapsedTime);
 }
示例#7
0
        public override void OnFrameMove(Device device, double totalTime, float elapsedTime)
        {
            if (surfaceDefinition.Type == AircraftParameters.ControlSurfaceTypeEnum.PropHighRPM ||
                surfaceDefinition.Type == AircraftParameters.ControlSurfaceTypeEnum.RotorHighRPM ||
                surfaceDefinition.Type == AircraftParameters.ControlSurfaceTypeEnum.TailrotorHighRPM)
            {
                if (Program.Instance.TransparentObjectManager.Rendering == false)
                {
                    return;
                }
                if (surfaceDefinition.Type == AircraftParameters.ControlSurfaceTypeEnum.PropHighRPM)
                {
                    if (airplaneControl.Throttle < 0.1)
                    {
                        this.Visible = false;
                    }
                    else
                    {
                        this.Visible = true;
                    }
                }
                else
                {
                    this.Visible = true;
                }
            }

            double controlInput = 0;

            switch (surfaceDefinition.Channel)
            {
            case AircraftParameters.ChannelEnum.None:
                break;

            case AircraftParameters.ChannelEnum.Elevator:
                controlInput = airplaneControl.Elevator * (surfaceDefinition.Reversed ? -1 : 1);
                break;

            case AircraftParameters.ChannelEnum.Rudder:
                controlInput = airplaneControl.Rudder * (surfaceDefinition.Reversed ? -1 : 1);
                break;

            case AircraftParameters.ChannelEnum.Aileron:
                controlInput = airplaneControl.Ailerons * (surfaceDefinition.Reversed ? -1 : 1);
                break;

            case AircraftParameters.ChannelEnum.Throttle:
                controlInput = airplaneControl.Throttle * (surfaceDefinition.Reversed ? -1 : 1);
                break;

            case AircraftParameters.ChannelEnum.Flaps:
                controlInput = airplaneControl.Flaps * (surfaceDefinition.Reversed ? -1 : 1);
                break;

            case AircraftParameters.ChannelEnum.Gear:
                controlInput = airplaneControl.Gear * (surfaceDefinition.Reversed ? -1 : 1);
                break;
            }
            if (surfaceDefinition.Type == AircraftParameters.ControlSurfaceTypeEnum.Normal ||
                surfaceDefinition.Type == AircraftParameters.ControlSurfaceTypeEnum.Reflective)
            {
                if (controlInput < 0)
                {
                    this.RotationAngle = (float)(surfaceDefinition.ZeroAngle - controlInput * (surfaceDefinition.MinimumAngle - surfaceDefinition.ZeroAngle));
                }
                else
                {
                    this.RotationAngle = (float)(surfaceDefinition.ZeroAngle + controlInput * (surfaceDefinition.MaximumAngle - surfaceDefinition.ZeroAngle));
                }
            }
            else if (surfaceDefinition.Type == AircraftParameters.ControlSurfaceTypeEnum.PropHighRPM)
            {
                this.RotationAngle += (8f * elapsedTime * (float)(controlInput - 0.5));
            }
            else if ((surfaceDefinition.Type == AircraftParameters.ControlSurfaceTypeEnum.PropFoldingLowRPM) ||
                     (surfaceDefinition.Type == AircraftParameters.ControlSurfaceTypeEnum.PropLowRPM))
            {
                if (airplaneControl.AircraftParameters.EngineMinFrequency > 0)
                {
                    this.RotationAngle += 1000f * elapsedTime * (float)(controlInput + 0.13);
                }
                else
                {
                    this.RotationAngle += 1000f * elapsedTime * (float)(controlInput);
                }
            }
            else if (surfaceDefinition.Type == AircraftParameters.ControlSurfaceTypeEnum.RotorHighRPM)
            {
                this.RotateXAngle    = (float)airplaneControl.Elevator * 0.05f;
                this.RotateZAngle    = (float)airplaneControl.Ailerons * 0.05f;
                this.RotateYAngle   += elapsedTime * (800 - airplaneControl.RotorRPM) / 100;
                this.OrientationMode = OrientationModeEnum.YXZ;
            }
            else if (surfaceDefinition.Type == AircraftParameters.ControlSurfaceTypeEnum.RotorLowRPM)
            {
                this.RotationAngle += elapsedTime * airplaneControl.RotorRPM;
            }
            else if (surfaceDefinition.Type == AircraftParameters.ControlSurfaceTypeEnum.TailrotorHighRPM)
            {
                this.RotationAngle += 2 * elapsedTime;
            }
            else if (surfaceDefinition.Type == AircraftParameters.ControlSurfaceTypeEnum.TailrotorLowRPM)
            {
                this.RotationAngle += 2 * elapsedTime * airplaneControl.RotorRPM;
            }
            else
            {
                this.RotationAngle = 0f;
            }

            if ((reflectionShader != null) && (Reflection.Instance.CubeMap != null))
            {
                reflectionShader.SetVariable("SkyboxTexture", Reflection.Instance.CubeMap);
            }

            base.OnFrameMove(device, totalTime, elapsedTime);
        }
示例#8
0
        public void RenderTextures(Device device, double totalTime, float elapsedTime)
        {
            if (qualityLevel != QualityLevelEnum.Low)
            {
                rendering = true;
                if (reflectionSurface == null)
                {
                    reflectionSurface = reflectionTexture.GetSurfaceLevel(0);
                }
                if (refractionSurface == null)
                {
                    refractionSurface = refractionTexture.GetSurfaceLevel(0);
                }
                renderHelper.BeginScene(reflectionSurface);
                //Surface screen = device.GetRenderTarget(0);
                //Surface reflectionSurface = reflectionTexture.GetSurfaceLevel(0);
                device.Clear(ClearFlags.ZBuffer | ClearFlags.Target, 0x00000000, 1.0f, 0);
                Framework.Instance.CurrentCamera.Reflected = true;

                /*
                 * // create matrices to render with
                 * Matrix camMatrix = Framework.Instance.CurrentCamera.ReflectionMatrix *
                 *  Framework.Instance.CurrentCamera.ProjectionMatrix;
                 * camMatrix.Invert();
                 * camMatrix.Transpose(camMatrix);
                 *
                 * //Plane reflectionClipPlane = Plane.FromPointNormal(Vector3.Empty, planeNormalDirection);
                 * Plane reflectionClipPlane = new Plane(0f, 1f, 0f, 0.1f);
                 * reflectionClipPlane.Transform(camMatrix);
                 *
                 * device.ClipPlanes[0].Plane = reflectionClipPlane;
                 * device.ClipPlanes[0].Enabled = true;
                 */
                device.Transform.View = Framework.Instance.CurrentCamera.ReflectionMatrix;
                if (onFrameRender != null)
                {
                    onFrameRender(device, totalTime, elapsedTime, true);
                }
                Framework.Instance.CurrentCamera.Reflected = false;

                waterShader.SetVariable("xReflectionMap", reflectionTexture);

                //device.ClipPlanes.DisableAll();

                device.Transform.World = Matrix.Identity;
                device.Transform.View  = Framework.Instance.CurrentCamera.ViewMatrix;
                renderHelper.EndScene(Filter.None);


                renderHelper.BeginScene(refractionSurface);
                device.Clear(ClearFlags.ZBuffer | ClearFlags.Target, 0x00000000, 1.0f, 0);

                //device.Transform.View = Framework.Instance.CurrentCamera.ViewMatrix;
                if (onFrameRender != null)
                {
                    onFrameRender(device, totalTime, elapsedTime, false);
                }
                waterShader.SetVariable("xRefractionMap", refractionTexture);
                //device.ClipPlanes.DisableAll();
                //device.Transform.World = Matrix.Identity;
                //device.Transform.View = Framework.Instance.CurrentCamera.ViewMatrix;
                renderHelper.EndScene(Filter.None);

                if (reflectionSurface != null)
                {
                    reflectionSurface.Dispose();
                    reflectionSurface = null;
                }
                if (refractionSurface != null)
                {
                    refractionSurface.Dispose();
                    refractionSurface = null;
                }

                rendering = false;
            }
        }
示例#9
0
        public Water(Vector3 position, float size, QualityLevelEnum quality)
        {
            this.qualityLevel = quality;
            squareMesh        = new SquareMesh(size, 1, 1, 1.0f);
            this.Mesh         = squareMesh;
            this.RotateXAngle = (float)Math.PI / 2;
            this.Position     = position;

            if (quality != QualityLevelEnum.Low)
            {
                Vector3 point1 = new Vector3(-1, 0f, 1);
                Vector3 point2 = new Vector3(1, 0f, 1);
                Vector3 point3 = new Vector3(-1, 0f, -1);
                Plane   plane  = Plane.FromPoints(point1, point2, point3);

                // reflection
                //reflectionTexture = new TextureBase(256, 256);
                reflectionClipPlane = plane;

                // refraction
                plane               = Plane.FromPoints(point1, point2, point3);
                plane.C            *= -1;
                refractionClipPlane = plane;

                waterNormalTexture = new TextureBase("waterbump.dds");

                // initialize shader
                waterShader = new ShaderBase("water", "watereffects.fx");
                waterShader.SetVariable("xWorld", ShaderBase.ShaderParameters.World);
                waterShader.SetVariable("xView", ShaderBase.ShaderParameters.View);
                waterShader.SetVariable("xReflectionView", ShaderBase.ShaderParameters.Reflection);
                waterShader.SetVariable("xProjection", ShaderBase.ShaderParameters.Projection);
                //waterShader.SetVariable("xReflectionMap", reflectionTexture);
                //waterShader.SetVariable("xRefractionMap", refractionTexture);
                waterShader.SetVariable("xDrawMode", reflectionRefractionRatio);
                waterShader.SetVariable("fresnelMode", fresnelMode);
                waterShader.SetVariable("xdullBlendFactor", 0.2f);
                waterShader.SetVariable("xEnableTextureBlending", 0);
                waterShader.SetVariable("xWaterBumpMap", waterNormalTexture);
                waterShader.SetVariable("xWaterPos", new Vector3(position.X, position.Z, position.Y));

                // parameteres for the wave
                waterShader.SetVariable("WaveLength", 0.1f);
                waterShader.SetVariable("WaveHeight", 0.4f);
                waterShader.SetVariable("SunPosition", new Vector3(1.0f, 1.0f, 1.0f));
                //waterShader.SetVariable("xCamPos", Framework.Instance.CurrentCamera.LookFrom);

                //waterShader.SetVariable("xTime", totalTime);
                waterShader.SetVariable("xWindForce", 20.0f);
                waterShader.SetVariable("xWindDirection", Matrix.RotationY(1.0f));

                //specular reflection parameters
                waterShader.SetVariable("specPower", 364);
                waterShader.SetVariable("specPerturb", 4);

                waterShader.SetTechnique("Water");

                CreateShaderResources(Framework.Instance.Device);

                this.Shader = waterShader;
            }
            else // low quality
            {
                squareMesh.Texture = new TextureBase("water.jpg");
            }

            Framework.Instance.DeviceReset += new Bonsai.Core.EventArgs.DeviceEventHandler(Instance_DeviceReset);
            Framework.Instance.DeviceLost  += new EventHandler(Instance_DeviceLost);
        }
示例#10
0
        public Terrain(Program owner)
        {
            vegetation = new Vegetation(owner);

            ground              = new GameObject();
            heightMap           = new Heightmap("data/text_height.png", 1000f, 100, 100);
            heightMap.MaxHeight = 100f;
            TerrainMesh sceneryMesh = new TerrainMesh(1.0f, heightMap);

            //sceneryMesh.Texture = new Bonsai.Objects.Textures.TextureBase("data\\grass.png");
            ground.Mesh = sceneryMesh;
            //ground.RotateXAngle = (float)Math.PI / 2;

            splatShader = new ShaderBase("splatting", "splatting3.fx");
            if (Framework.Instance.DeviceCaps.PixelShaderVersion.Major >= 3)
            {
                splatShader.SetTechnique("TextureSplatting_fx30");
            }
            else
            {
                splatShader.SetTechnique("TextureSplatting");
            }
            splatShader.SetVariable("matViewProj", ShaderBase.ShaderParameters.CameraProjection);
            splatShader.SetVariable("sunPosition", new Vector3(1, 1, 1));
            splatShader.SetVariable("underwater", 0.0f);
            splatShader.SetVariable("matWorld", ShaderBase.ShaderParameters.World);
            splatShader.SetVariable("matInvertTransposeWorld", ShaderBase.ShaderParameters.WorldInvertTranspose);
            splatShader.SetVariable("cameraPos", ShaderBase.ShaderParameters.CameraPosition);
            splatShader.SetVariable("nearRepeat", 64.0f);
            splatShader.SetVariable("farRepeat", 20.0f);
            splatShader.SetVariable("nearFactor2", 3.0f);
            splatShader.SetVariable("farFactor2", 2.0f);
            splatShader.SetVariable("nearFactor3", 3.0f);
            splatShader.SetVariable("farFactor3", 2.0f);
            splatShader.SetVariable("nearFactor4", 3.0f);
            splatShader.SetVariable("farFactor4", 2.0f);
            splatShader.SetVariable("blendSqDistance", 50f * 50f);
            splatShader.SetVariable("blendSqWidth", 1.0f / (200f * 200f));
            TextureBase normalMap       = new TextureBase("data/text_norm.png");
            TextureBase alphaMap        = new TextureBase("data/text.dds");
            TextureBase grassTexture    = new TextureBase("data/grass.png");
            TextureBase rockTexture     = new TextureBase("data/rock.png");
            TextureBase rockNormal      = new TextureBase("data/splat_rock_normal.jpg");
            TextureBase sandTexture     = new TextureBase("data/sand.png");
            TextureBase concreteTexture = new TextureBase("data/road.png");

            splatShader.SetVariable("NormalMapTexture", normalMap);
            splatShader.SetVariable("AlphaTexture", alphaMap);
            splatShader.SetVariable("DetailTexture1", grassTexture);
            splatShader.SetVariable("DetailTexture2", rockTexture);
            splatShader.SetVariable("DetailTexture2NormalMap", rockNormal);
            splatShader.SetVariable("DetailTexture3", sandTexture);
            splatShader.SetVariable("DetailTexture4", concreteTexture);

            ground.Shader = splatShader;
        }