Updated script to use the -ireplace method instead of .replace. This solves an issue I had generating parallax maps for Markarth, where for some reason the textures were named _N instead of _n and this caused the outputs to overwrite them. Fixed code has been added to the description as well as updated in the downloads page.
Ensure that you have all requirements installed. ImageMagick should have a check box during installation to add it to your PATH.
Back up your textures. The script operates within a single working directory, so copy it into the folder where you're working. You can use it other ways but this is safest. This means the .ps1 file should be in the same folder as your textures each time you're working.
Open terminal in the folder where your textures are, and type 'par' and hit tab. This should autocomplete to './parallaxMap.ps1' if your copy of the script is in the right place. Hit enter. If everything is working correctly you should see textures with the suffix _p begin to appear. You now have parallax maps. They're half the resolution of the normals by default, but you can change that in the script if it bothers you.
You still need to ensure your meshes are parallax ready to see the effect work and to have ENB or community shaders set up as normal, and there are other tools and downloads for that. This part is outside my scope.
This is great and thank you for it! Is there a way to make imagemagick read BC7 files? I've read on github that they've added support for it some years ago, but when I try it on my BC7 files, it doesn't work. I know the question is irrelevant to the actual script, but I'm just wondering, maybe you know a solution about this?
To answer my own question, you can bypass this problem by re-saving the BC7 files to BC1 using texconv. This should only be done on a temp directory, on files you are working with to create your height maps. When done, copy the _p.dds files to Skyrim and delete everything else. The parallax maps should be placed to the correct folder structure, but if you are planning to use this script, I guess you know what you're doing already.
To resave to BC1, add the texconv.exe file to wherever you placed imagemagick (so it's already in the Windows PATH variable), and add the following line, above the "& magick ...." line in the script: & texconv -pow2 -f BC1_UNORM $normalMapPath -y
I tried using this to generate some quick and dirty terrain parallax for BS:Bruma so I wouldn't have to uncheck terrain parallax in CS every time I go there, but no luck. I mean the script ran fine and I'm pretty sure I put the textures in the right dirs after, it just had no effect in-game; still the spiky terrain.
For background, terrain parallax is different in that it's all or nothing - every terrain texture has to have an appropriate parallax map or you get very ugly parallax spiking on the textures missing it, because Auto Parallax will not save you (I guess). There's probably other stuff going on beyond me. There's plenty of texture packs that cover all the skyrim landscape textures, not so for Bruma (nor would I expect there to be, for a preview of an in-dev mod).
I'm a novice when it comes to the texture/mesh side of modding - I expect there's just something different about terrain that makes this not work out quite as smoothly as I'd naively expect. I get needing a parallax enabled mesh, but in this case it's just like, the ground. I'm not quite sure why a _p.dds is loaded fine for the ground in Skyrim, and some of the vanilla landscape textures used in Bruma, but not the ground in the BSHeartland worldspace.
The current version of the script cannot be run on an entire mod with multiple subfolders. To fix this / increase QoL, you can add the "Recurse" flag, and it will take care of all directories:
can we get a tutorial on how to do this please? i am trying my best to get folkvangr to use parallax but no succes, opening a powershell in the desired maps and using the command does nothing for me and i cant for the love of god understand this "Make sure to add to windows PATH variable (Environment Variables), and don't have any spaces in the directory name."
Do you have ImageMagick installed? It won't work without that. And It still won't do anything for a set like Folkvangr unless you have parallax enabled meshes for it, so keep that in mind.
I'll add the off site link to ImageMagick in the requirements since I realize now I forgot to do that.
For those of you having problems trying to get this to work. Step one go to the folder with textures you are trying to parallax step two right click in the open spac of the folder and open it in terminal step three copy script and paste in in terminal crtl plus v press enter see video for addtional visual
I think what the OP means is what Majestic Mountains Enb Parallax is doing. It's not the same as what regular parallax (and hopefully will make it obsolete).
the parallax map is ALWAYS the same shit. It's just how it's implemented. MM doesn't do sth REVOLUTIONARY either. It just tries implementing parallax in a way where it causes the least issues with multilayer parallay. It's still mesh parallax, nothing rly new.
IDK what MM does on the mesh level, this lets you ensure there is a parallax map that matches the normals of the input textures to some extent. As long as the meshes are set up to use it, it should work, whether it's multilayer parallax or not.
Whether it works *well* is up to the authors and users to decide.
I switched from better dynamic snow to simplicity of snow a while ago though so really no idea on that front.
That's certainly an option. I might, and anyone looking to use this obviously can - I'm just very aware it increases my risk of getting a comment from someone who didn't read my suggestions and is like "AAA I ran this on my ENTIRE mod organizer profile and it did something BAD" lol
But you're right it'd increase usability for larger projects.
EDIT: So here's the thing. After a bit more testing, I don't actually recommend doing it on subfolders, because it's not always, 100% of the time, completely safe. Sometimes naming convention of texture sets are off in unexpected ways. At least once in my own tests I've seen it overwrite the normal maps instead, inexplicably. It's just a better idea to run it in a single folder, ideally one you've backed up just in case. That way if something does go wrong, for whatever reason, you should see it immediately and be able to restore your backup. (Specifically, it seems to have a ... problem if the normals are named with the wrong case. I'm going to have to fix that first.)
You're obviously free to do whatever you feel comfortable with, modify it in any way, etc etc, but I can't be responsible if it goes off the rails.
23 comments
You still need to ensure your meshes are parallax ready to see the effect work and to have ENB or community shaders set up as normal, and there are other tools and downloads for that. This part is outside my scope.
To resave to BC1, add the texconv.exe file to wherever you placed imagemagick (so it's already in the Windows PATH variable), and add the following line, above the "& magick ...." line in the script:
& texconv -pow2 -f BC1_UNORM $normalMapPath -y
For background, terrain parallax is different in that it's all or nothing - every terrain texture has to have an appropriate parallax map or you get very ugly parallax spiking on the textures missing it, because Auto Parallax will not save you (I guess). There's probably other stuff going on beyond me. There's plenty of texture packs that cover all the skyrim landscape textures, not so for Bruma (nor would I expect there to be, for a preview of an in-dev mod).
I'm a novice when it comes to the texture/mesh side of modding - I expect there's just something different about terrain that makes this not work out quite as smoothly as I'd naively expect. I get needing a parallax enabled mesh, but in this case it's just like, the ground. I'm not quite sure why a _p.dds is loaded fine for the ground in Skyrim, and some of the vanilla landscape textures used in Bruma, but not the ground in the BSHeartland worldspace.
script.patch:
- Get-ChildItem *_n.dds | ForEach-Object {
+ Get-ChildItem *_n.dds -Recurse | ForEach-Object {
$normalMapPath = $_.FullName
$heightMapPath = $normalMapPath -ireplace "_n.dds$", "_p.dds"
# ...
Edit: this has already been discussed further down ;) Feel free to ignore :D
I'll add the off site link to ImageMagick in the requirements since I realize now I forgot to do that.
Step one
go to the folder with textures you are trying to parallax
step two
right click in the open spac of the folder and open it in terminal
step three
copy script and paste in in terminal crtl plus v
press enter
see video for addtional visual
Thank you for making this btw!EDIT: Never mind, got it working. I forgot to add your .ps1 script into the appropriate directory. This is awesome!
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Whether it works *well* is up to the authors and users to decide.
I switched from better dynamic snow to simplicity of snow a while ago though so really no idea on that front.
But you're right it'd increase usability for larger projects.
EDIT: So here's the thing. After a bit more testing, I don't actually recommend doing it on subfolders, because it's not always, 100% of the time, completely safe. Sometimes naming convention of texture sets are off in unexpected ways. At least once in my own tests I've seen it overwrite the normal maps instead, inexplicably. It's just a better idea to run it in a single folder, ideally one you've backed up just in case. That way if something does go wrong, for whatever reason, you should see it immediately and be able to restore your backup. (Specifically, it seems to have a ... problem if the normals are named with the wrong case. I'm going to have to fix that first.)
You're obviously free to do whatever you feel comfortable with, modify it in any way, etc etc, but I can't be responsible if it goes off the rails.