Index: /OpenSceneGraph/trunk/include/osgTerrain/Layer
===================================================================
--- /OpenSceneGraph/trunk/include/osgTerrain/Layer (revision 9618)
+++ /OpenSceneGraph/trunk/include/osgTerrain/Layer (revision 11287)
@@ -192,4 +192,51 @@
         }
 
+        inline bool getInterpolatedValidValue(double ndc_x, double ndc_y, float& value)
+        {
+            unsigned int i,j;
+            double ir, jr;
+            computeIndices(ndc_x, ndc_y, i, j, ir, jr);
+            value = 0.0f;
+            double div = 0.0f;
+            float v,r;
+
+            r = (1.0f-ir)*(1.0f-jr);
+            if (r>0.0 && getValidValue(i,j,v))
+            {
+                value += v*r;
+                div += r;
+            }
+
+            r = (ir)*(1.0f-jr);
+            if (r>0.0 && getValidValue(i+1,j,v))
+            {
+                value += v*r;
+                div += r;
+            }
+
+            r = (ir)*(jr);
+            if (r>0.0 && getValidValue(i+1,j+1,v))
+            {
+                value += v*r;
+                div += r;
+            }
+
+            r = (1.0f-ir)*(jr);
+            if (r>0.0 && getValidValue(i,j+1,v))
+            {
+                value += v*r;
+                div += r;
+            }
+
+            if (div != 0.0)
+            {
+                value /= div;
+                return true;
+            }
+
+            value = 0.0;
+            return false;
+        }
+
         /** increment the modified count."*/
         virtual void dirty() {};
Index: /OpenSceneGraph/trunk/src/osgTerrain/GeometryTechnique.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgTerrain/GeometryTechnique.cpp (revision 11259)
+++ /OpenSceneGraph/trunk/src/osgTerrain/GeometryTechnique.cpp (revision 11287)
@@ -311,5 +311,5 @@
                 Locator* locator = colorLayer->getLocator();
                 if (!locator)
-                {            
+                {
                     osgTerrain::SwitchLayer* switchLayer = dynamic_cast<osgTerrain::SwitchLayer*>(colorLayer);
                     if (switchLayer)
@@ -322,6 +322,6 @@
                         }
                     }
-                }            
-            
+                }
+
                 TexCoordLocatorPair& tclp = layerToTexCoordMap[colorLayer];
                 tclp.first = new osg::Vec2Array;
@@ -356,23 +356,18 @@
             unsigned int iv = j*numColumns + i;
             osg::Vec3d ndc( ((double)i)/(double)(numColumns-1), ((double)j)/(double)(numRows-1), 0.0);
-     
+
             bool validValue = true;
-     
-            
-            unsigned int i_equiv = i_sampleFactor==1.0 ? i : (unsigned int) (double(i)*i_sampleFactor);
-            unsigned int j_equiv = i_sampleFactor==1.0 ? j : (unsigned int) (double(j)*j_sampleFactor);
-            
             if (elevationLayer)
             {
                 float value = 0.0f;
-                validValue = elevationLayer->getValidValue(i_equiv,j_equiv, value);
-                // OSG_INFO<<"i="<<i<<" j="<<j<<" z="<<value<<std::endl;
+                if (sampleRatio==1.0) validValue = elevationLayer->getValidValue(i,j,value);
+                else validValue = elevationLayer->getInterpolatedValidValue(ndc.x(), ndc.y(), value);
                 ndc.z() = value*scaleHeight;
             }
-            
+
             if (validValue)
             {
                 indices[iv] = vertices->size();
-            
+
                 osg::Vec3d model;
                 masterLocator->convertLocalToModel(ndc, model);
@@ -417,5 +412,5 @@
         }
     }
-    
+
     // populate primitive sets
 //    bool optimizeOrientations = elevations!=0;
