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:
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:
This is a solo project, so the “simplest” way is preferred to the “right” way unfortunately. Any insight will be greatly appreciated!