Es gibt unterschiedliche Möglichkeiten für das Überblenden. Man kann einfach die eine Textur über die andere legen und deren Alpha-Wert in gewünschter Richtung absteigen lassen. Das ist die einfachste Möglichkeit, die aber sehr wahrscheinlich das schlechteste (wenigste hübsche) Ergebnis liefert.
Man könnte genauso die Texturen speziell für die Übergänge überarbeiten, damit es auch ein visuell gut aussehender Übergang wird. Das wäre wiederum, wie du richtig festgestellt hast recht aufwändig, vor allem aber wenn man zwischen allen möglichen Kombinationen Übergänge ermöglichen möchte. Man kann sich aber auch das wieder vereinfachen, indem man von bestimmten Dingen ausgeht.
Beispiele wären, dass Kohle und Erze immer in Stein zu finden sind und die Übergänge zwischen diesen immer erst vom einen zu Stein und dann von Stein zu dem anderen gehen. Man kann für den Übergang immernoch so vorgehen, dass für bestimmte Blockarten ein Rand mit transparenz erstellt wird, welcher dann über den umliegenden Blocktypen gezeichnet wird. Entweder würde dabei der Blocktyp mit Transparenz leicht über sein Feld hinausragen, was auch einfacher wäre, oder die umliegenden würden auf dieses Feld überragen. Auf diese Weise können Übergänge zwischen Dreck und Stein, Dreck und Kohle, Dreck und Erz usw. relativ einfach erstellt werden.
Wichtig ist bei den Übergängen auch, ob innerhalb eines Felds der gesamte Übergang dargestellt wird (was man häufig bei Tilesets sieht), was zur Folge hat, dass die Kanten visuell immer eindeutig einem Typen zugeordnet werden können, oder der Übergang findet zwischen den Blöcken statt, wodurch entsprechende Kanten die Mitte des Übergangs darstellen. Für das 1. bräuchte man zwingen eine Art Ordnung, damit man immer weiß, mit welchem Blocktypen bei welchen Kombinationen der Übergang dargestellt wird.
Im Zusammenhang mit der Lichtberechnung könnte
dieser Artikel über 2D-Sichtbarkeitsberechnungen interessant sein. Im Grunde ist es die gleiche Berechnung, die du durchführen müsstest, nur dass aus dem Ergebnis die Lightmap generiert wird und du ggf. noch Optimierungen einbringen könntest.