I am rendering a grid of quads to represent a section of a landscape. Each quad has its own separate texture (required) and elevation. I use an averaging algorithm so the vertices of a given quad line up with those of its eight adjacent quads (imperfect but fix is known). How can I shade the grid of quads with respect to an OpenGL light? My code looks like this:

Code :
Public Sub Tile_Grid()
 
  ' Draw tile grid texture array in render window.
 
  ' General declarations.
  Dim TileGridX As Short      ' Tile in tile grid texture array being rendered.
  Dim TileGridY As Short      ' Tile in tile grid texture array being rendered.
  Dim TileGridX1 As Short     ' Starting tile in tile grid texture array to be rendered.
  Dim TileGridY1 As Short     ' Starting tile in tile grid texture array to be rendered.
  Dim TileGridX2 As Short     ' Ending tile in tile grid texture array to be rendered.
  Dim TileGridY2 As Short     ' Ending tile in tile grid texture array to be rendered.
  Dim OffsetX As Short        ' Tile offset relative to tile grid position.
  Dim OffsetY As Short        ' Tile offset relative to tile grid position.
  Dim StepX As Short          ' Direction to step through tile grid texture array loop.
  Dim StepY As Short          ' Direction to step through tile grid texture array loop.
  Dim InverseX As Single
  Dim InverseY As Single
  Dim ScreenOffsetX As Single
  Dim ScreenOffsetY As Single
  Dim Elevation As Single
  Dim Elevation1 As Single
  Dim Elevation2 As Single
  Dim Elevation3 As Single
  Dim Elevation4 As Single
  Dim Elevation5 As Single
  Dim Elevation6 As Single
  Dim Elevation7 As Single
  Dim Elevation8 As Single
  Dim Elevation9 As Single
  Dim Counter As Single
 
  ' Assign initial values to variables.
  TileGridX1 = TileGrid.CenterX
  TileGridY1 = TileGrid.CenterY
  TileGridX2 = TileGrid.CenterX + TileGrid.Size - 1
  TileGridY2 = TileGrid.CenterY + TileGrid.Size - 1
  If TileGridX1 < TileGridX2 Then
    StepX = 1
  Else
    StepX = -1
  Endif
  If TileGridY1 < TileGridY2 Then
    StepY = 1
  Else
    StepY = -1
  Endif
 
  ' Enable depth testing.
  Gl.Enable(Gl.DEPTH_TEST)
 
  ' Render tile grid texture array.
  For TileGridY = TileGridY1 To TileGridY2 Step StepY
    For TileGridX = TileGridX1 To TileGridX2 Step StepX
      ' Calculate diagonally bordering tiles' elevations.
      Elevation1 = dElevation[Camera.CellGridX - TileGrid.Offset + OffsetX - 1, Camera.CellGridY - TileGrid.Offset + OffsetY - 1] / 12 * ElevationScale
      Elevation2 = dElevation[Camera.CellGridX - TileGrid.Offset + OffsetX + 0, Camera.CellGridY - TileGrid.Offset + OffsetY - 1] / 12 * ElevationScale
      Elevation3 = dElevation[Camera.CellGridX - TileGrid.Offset + OffsetX + 1, Camera.CellGridY - TileGrid.Offset + OffsetY - 1] / 12 * ElevationScale
      Elevation4 = dElevation[Camera.CellGridX - TileGrid.Offset + OffsetX - 1, Camera.CellGridY - TileGrid.Offset + OffsetY + 0] / 12 * ElevationScale
      Elevation5 = dElevation[Camera.CellGridX - TileGrid.Offset + OffsetX + 0, Camera.CellGridY - TileGrid.Offset + OffsetY + 0] / 12 * ElevationScale
      Elevation6 = dElevation[Camera.CellGridX - TileGrid.Offset + OffsetX + 1, Camera.CellGridY - TileGrid.Offset + OffsetY + 0] / 12 * ElevationScale
      Elevation7 = dElevation[Camera.CellGridX - TileGrid.Offset + OffsetX - 1, Camera.CellGridY - TileGrid.Offset + OffsetY + 1] / 12 * ElevationScale
      Elevation8 = dElevation[Camera.CellGridX - TileGrid.Offset + OffsetX + 0, Camera.CellGridY - TileGrid.Offset + OffsetY + 1] / 12 * ElevationScale
      Elevation9 = dElevation[Camera.CellGridX - TileGrid.Offset + OffsetX + 1, Camera.CellGridY - TileGrid.Offset + OffsetY + 1] / 12 * ElevationScale
      ' Select texture using its ID.
      Gl.BindTexture(Gl.TEXTURE_2D, tTileGrid[Convert.Wrap_Short(0, TileGrid.Size - 1, TileGridX), Convert.Wrap_Short(0, TileGrid.Size - 1, TileGridY)][0])
      ' Create the quad the texture is drawn on.
      Gl.Begin(Gl.QUADS)
        ' Top-left vertex.
        Gl.TexCoord2i(0, 0)
        Gl.Vertex3f(TileGrid.WorldX + OffsetX, TileGrid.WorldY + OffsetY, (Elevation1 + Elevation2 + Elevation4 + Elevation5) / 4)
        ' Top-right vertex.
        Gl.TexCoord2i(1, 0)
        Gl.Vertex3f(TileGrid.WorldX + OffsetX + 1, TileGrid.WorldY + OffsetY, (Elevation2 + Elevation3 + Elevation6 + Elevation5) / 4)
        ' Bottom-right vertex.
        Gl.TexCoord2i(1, 1)
        Gl.Vertex3f(TileGrid.WorldX + OffsetX + 1, TileGrid.WorldY + OffsetY + 1, (Elevation6 + Elevation8 + Elevation9 + Elevation5) / 4)
        ' Bottom-left vertex.
        Gl.TexCoord2i(0, 1)
        Gl.Vertex3f(TileGrid.WorldX + OffsetX, TileGrid.WorldY + OffsetY + 1, (Elevation4 + Elevation7 + Elevation8 + Elevation5) / 4)
      Gl.End()
      ' Adjust tile position.
      OffsetX = OffsetX + 1
      If OffsetX = TileGrid.Size Then OffsetX = 0
    Next
    ' Adjust tile positions.
    OffsetX = 0
    OffsetY = OffsetY + 1
    If OffsetY = TileGrid.Size Then OffsetY = 0
  Next
 
End

The render looks like this:

http://youtu.be/vFan5CKB98c

This is a solo project, so the "simplest" way is preferred to the "right" way unfortunately. Any insight will be greatly appreciated!