Skip to content

Instantly share code, notes, and snippets.

@coderofsalvation
Last active January 5, 2022 09:23
Show Gist options
  • Save coderofsalvation/a764800e172e82ce2bf0fe60bb0241a9 to your computer and use it in GitHub Desktop.
Save coderofsalvation/a764800e172e82ce2bf0fe60bb0241a9 to your computer and use it in GitHub Desktop.
equirectangular map to plain-mipmapped cubemap (lovr) converter (using ffmpeg)
#!/bin/sh
# usage: ./equi2lovr.sh equi.png
mkdir env 2>/dev/null
ffmpeg -i $1 -vf "v360=input=equirect:output=c6x1" -y -vframes 1 $1.map.jpg
i=0
for face in px nx py ny pz nz; do
ffmpeg -i $1.map.jpg -filter_complex '[0:v] crop=(iw/6):ih:((iw/6)*'$i'):0,split=10[m][m0][m1][m2][m3][m4][m5][m6][m7][m8]' \
-map '[m]' -s 1024x1024 env/$face.png \
-map '[m0]' -s 256x256 env/m0_$face.png \
-map '[m1]' -s 128x128 env/m1_$face.png \
-map '[m2]' -s 64x64 env/m2_$face.png \
-map '[m3]' -s 32x32 env/m3_$face.png \
-map '[m4]' -s 16x16 env/m4_$face.png \
-map '[m5]' -s 8x8 env/m5_$face.png \
-map '[m6]' -s 4x4 env/m6_$face.png \
-map '[m7]' -s 2x2 env/m7_$face.png \
-map '[m8]' -s 1x1 env/m8_$face.png \
-y
i=`expr $i + 1`
done
@coderofsalvation
Copy link
Author

coderofsalvation commented Dec 30, 2021

It will just generate all the files into an env folder (for lua-usage see https://lovr.org/docs/Lighting/PBR_Materials)
ps. you can get equirectangular images from https://polyhaven.com

@coderofsalvation
Copy link
Author

coderofsalvation commented Dec 31, 2021

The 'right' way to do it is using cmgen at https://github.com/google/filament (available precompiled on releases page) that is able to generate these physically correct "prefiltered cubemaps", along with spherical harmonics constants:

$ convert someequirect.png -flatten +matte env.png      # cmgen needs RGB (not RGBA) in case of png/jpg
$ ./bin/cmgen --type=cubemap --format=png -x out env.hdr       # but hdr-files are bettetr
Decoding image...
Converting equirectangular image... 
Mirroring...
IBL mipmaps for prefiltered importance sampling...
IBL prefiltering...
Level 0, roughness = 0, roughness (perceptual) = 0
100% ████████████████████████████████◀
Level 1, roughness = 0.00417, roughness (perceptual) = 0.0646
100% ████████████████████████████████◀
Level 2, roughness = 0.0179, roughness (perceptual) = 0.134
100% ████████████████████████████████◀
Level 3, roughness = 0.0439, roughness (perceptual) = 0.209
100% ████████████████████████████████◀
Level 4, roughness = 0.0858, roughness (perceptual) = 0.293
100% ████████████████████████████████◀
Level 5, roughness = 0.15, roughness (perceptual) = 0.388
100% ████████████████████████████████◀
Level 6, roughness = 0.25, roughness (perceptual) = 0.5
100% ████████████████████████████████◀
Level 7, roughness = 0.418, roughness (perceptual) = 0.646
100% ████████████████████████████████◀
Level 8, roughness = 1, roughness (perceptual) = 1
100% ████████████████████████████████◀
(base) [leon@ls540/tmp/filament/bin]  $ find env
env
env/equirect
env/equirect/is_m5.png
env/equirect/is_m8.png
env/equirect/m0.png
env/equirect/m8.png
env/equirect/is_m2.png
env/equirect/is_m3.png
env/equirect/m6.png
env/equirect/m2.png
env/equirect/m4.png
env/equirect/m1.png
env/equirect/is_m4.png
env/equirect/is_m0.png
env/equirect/is_m6.png
env/equirect/m7.png
env/equirect/is_m1.png
env/equirect/m3.png
env/equirect/is_m7.png
env/equirect/m5.png

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment