|
import sys |
|
from src.models.geometry.render import renderutils as ru |
|
import torch |
|
from src.models.geometry.render import util |
|
import nvdiffrast.torch as dr |
|
import os |
|
|
|
from PIL import Image |
|
import torchvision.transforms.functional as TF |
|
import torchvision.utils as vutils |
|
import imageio |
|
os.environ["OPENCV_IO_ENABLE_OPENEXR"]="1" |
|
LIGHT_MIN_RES = 16 |
|
|
|
MIN_ROUGHNESS = 0.04 |
|
MAX_ROUGHNESS = 1.00 |
|
|
|
class cubemap_mip(torch.autograd.Function): |
|
@staticmethod |
|
def forward(ctx, cubemap): |
|
return util.avg_pool_nhwc(cubemap, (2,2)) |
|
|
|
@staticmethod |
|
def backward(ctx, dout): |
|
res = dout.shape[1] * 2 |
|
out = torch.zeros(6, res, res, dout.shape[-1], dtype=torch.float32, device="cuda") |
|
for s in range(6): |
|
gy, gx = torch.meshgrid(torch.linspace(-1.0 + 1.0 / res, 1.0 - 1.0 / res, res, device="cuda"), |
|
torch.linspace(-1.0 + 1.0 / res, 1.0 - 1.0 / res, res, device="cuda"), |
|
indexing='ij') |
|
v = util.safe_normalize(util.cube_to_dir(s, gx, gy)) |
|
out[s, ...] = dr.texture(dout[None, ...] * 0.25, v[None, ...].contiguous(), filter_mode='linear', boundary_mode='cube') |
|
return out |
|
|
|
def build_mips(base, cutoff=0.99): |
|
specular = [base] |
|
while specular[-1].shape[1] > LIGHT_MIN_RES: |
|
specular.append(cubemap_mip.apply(specular[-1])) |
|
|
|
|
|
diffuse = ru.diffuse_cubemap(specular[-1]) |
|
|
|
for idx in range(len(specular) - 1): |
|
roughness = (idx / (len(specular) - 2)) * (MAX_ROUGHNESS - MIN_ROUGHNESS) + MIN_ROUGHNESS |
|
specular[idx] = ru.specular_cubemap(specular[idx], roughness, cutoff) |
|
specular[-1] = ru.specular_cubemap(specular[-1], 1.0, cutoff) |
|
|
|
return specular, diffuse |
|
|
|
|
|
|
|
def _load_env_hdr(fn, scale=1.0): |
|
latlong_img = torch.tensor(util.load_image(fn), dtype=torch.float32, device='cuda')*scale |
|
cubemap = util.latlong_to_cubemap(latlong_img, [512, 512]) |
|
|
|
specular, diffuse = build_mips(cubemap) |
|
|
|
return specular, diffuse |
|
|
|
def main(path_hdr, save_path_map): |
|
all_envs = os.listdir(path_hdr) |
|
|
|
for env in all_envs: |
|
env_path = os.path.join(path_hdr, env) |
|
base_n = os.path.basename(env_path).split('.')[0] |
|
|
|
try: |
|
if not os.path.exists(os.path.join(save_path_map, base_n)): |
|
os.makedirs(os.path.join(save_path_map, base_n)) |
|
specular, diffuse = _load_env_hdr(env_path) |
|
for i in range(len(specular)): |
|
tensor = specular[i] |
|
torch.save(tensor, os.path.join(save_path_map, base_n, f'specular_{i}.pth')) |
|
|
|
torch.save(diffuse, os.path.join(save_path_map, base_n, 'diffuse.pth')) |
|
except Exception as e: |
|
print(f"Error processing {env}: {e}") |
|
continue |
|
|
|
if __name__ == "__main__": |
|
if len(sys.argv) != 3: |
|
print("Usage: python script.py <path_hdr> <save_path_map>") |
|
sys.exit(1) |
|
|
|
path_hdr = sys.argv[1] |
|
save_path_map = sys.argv[2] |
|
|
|
if not os.path.exists(path_hdr): |
|
print(f"Error: path_hdr '{path_hdr}' does not exist.") |
|
sys.exit(1) |
|
|
|
if not os.path.exists(save_path_map): |
|
os.makedirs(save_path_map) |
|
|
|
main(path_hdr, save_path_map) |