Z blendera wyjdzie zawsze lepiej bo tam jest prawdziwa geometria i realne wektory normalne. W 2D to takie zgadywanie i pozostaje tylko manipulacja filtrami i innymi efektami w celu uzyskania w miarę wyglądającej tekstury. Być może pomogłoby tu jakieś AI albo może jakieś sieci neuronowe czy inne cuda które potrafiły by odczytać mapę wysokości ze zdjęcia?
Tutaj nie chodzi też o to czy piksel jest jaśniejszy czy nie ale bardziej o jego otoczenie. Piksel #808080 jak będzie miał wokoło sąsiednie piksele o wartości #808080 to będzie znaczyło, że leży na płaszczyźnie i na normal mapie jego kolor to #8080FF. Podobnie piksel czarny będzie miał kolor #8080FF jak wokoło będą same czarne. Jeżeli szary będzie sąsiadował z jednej strony z czarnym (najniższym) i białym (najwyższym) to znaczy że leży na stoku o nachyleniu 45 stopni i kolor normalmapy powinien być #2500DA. Już na podstawie tych danym powinieneś móc w stanie zrobić prostą konwersję height mapy na normalmapę, wystarczy potraktować piksele jako wysokość wierzchołków w siatce grida a później już z górki. Pewnie są jakieś liby co potrafią wyliczyć normalne w siatce.
Problem też jest taki, że pluginy nvidii czy te w gimpie badają otoczenie kilku pikseli i nie są w stanie "zobaczyć" większego trendu w zmianie wysokości w heightmapie. Jest jedna w miarę sensowna sztuczka, którą stosowałem, żeby zrobić normalmapę w gimpie, która dawała całkiem ładne cieniowanie:
1. Pierwszy etap do desaturacja obrazka, czyli konwersja na pseudo mapę wysokości. Można zgadnąć, że to jest jeden wielki fałsz bo coś jasnego na teksturze nie oznacza że jest wyżej. Ostre oświetlenie też zrobi przekłamania jak mocno oświetli kanty z jednej strony. Ogólnie przegrana sprawa
2. kopiujemy naszą mapę wysokości w kilku kopiach (widziałem tutoriale z kilkanaście a nawet z kilkadziesiąt różnych warstw :).
3. robimy normalmapę z pierwszej tekstury. Z niej uzyskujemy przede wszystkim drobne szczegóły, ale w szaderze będzie wyglądać ogólnie "płasko" i żaden pluggin nvidii tu nie pomoże.
4. na kolejnych pozostałych teksturach robimy blura o różnym stopniu i na nich robimy osobno normalmapy.
4a. można też zeskalować dany layer w dół i jego konwertować, pluggin będzie w stanie objąć większy obszar oryginalnej tekstury i uwydatnią się większe obiekty na teksturze (kamienie, cegły, etc.)

5. Doprowadzić poszczególne normalmapy do tych samych wymiarów (jeżeli były skalowane w dół) a następnie połączyć je w jedno. Można użyć trybu "Overlay" albo "Grain Merge" w Gimpie. One się najlepiej sprawdzają ale warto popróbować innych.
6. Po scaleniu w jedną warstwę warto ją znormalizować, żeby wektorki miały długość 1. W pluginie ustawiamy konwersję na "Normalize only".

7. 3D Preview pozwala ocenić wygląd naszej normalmapy, trzeba tylko zmienić stadardowe ustawienia z takich które nie występują w realnym świecie na bardziej sensowne. Zawsze Ambient zeruje a Diffuse na 50%, 100% w w przyrodzie nie występuje. Specular włączam i też ustawiam jak Diffuse.

Dzięki tej metodzie tekstura wydaje się "głębsza" i przy nisko padającym oświetleniu daje ładne cienie.
Powodzenia.