Package: panda3d-complexpbr
panda3d-complexpbrFunctional node level scene shader application for Panda3D. complexpbr supports realtime environment reflections for BSDF materials. These reflections are implemented with IBL (Image-based lighting) and PBR (Physically Based Rendering) forward shading constructs. Your machine must support GLSL version 430 or higher. Sample screenshots below.Featuring support for vertex displacement mapping, SSAO (Screen Space Ambient Occlusion), SSR (Screen Space Reflections), HSV color correction, Bloom, and Sobel based antialiasing in a screenspace kernel shader, which approximates temporal antialiasing. complexpbr.screenspace_init() automatically enables the AA, SSAO, SSR, and HSV color correction. To use the vertex displacement mapping, provide your displacement map as a shader input to your respective model node -- example below in the Usage section.By default, the environment reflections dynamically track the camera view. You may set a custom position with the 'env_cam_pos' apply_shader() input variable to IE fix the view to a skybox somewhere on the scene graph. This env_cam_pos variable can be updated live afterwards by setting base.env_cam_pos = Vec3(some_pos). The option to disable or re-enable dynamic reflections is available.As of version 0.5.2, complexpbr will default to a dummy BRDF LUT which it creates on the fly. complexpbr will remind you that you may create a custom BRDF LUT with the provided 'brdf_lut_calculator.py' script or copy the sample one provided. This feature is automatic, so if you provide the output_brdf_lut.png file in your program directory, it will default to that .png image ignoring the lut_fill input. The sample 'output_brdf_lut.png' and the creation script can be found in the panda3d-complexpbr git repo. For advanced users there is an option to set the LUT image RGB fill values via apply_shader(lut_fill=[r,g,b]) . See Usage section for an example of lut_fill.As of version 0.5.3, hardware skinning support is provided via complexpbr.skin(your_actor) for models with skeletal animations. See Usage section for an example of hardware skinning.The goal of this project is to provide extremely easy to use scene shaders to expose the full functionality of Panda3D rendering, including interoperation with CommonFilters and setting shaders on a per-node basis.7/6/23 Lumberyard Bistro (Amazon Lumberyard Bistro | NVIDIA Developer)6/1/23 Sponza (Intel GPU Research Samples)Usage:fromdirect.showbase.ShowBaseimportShowBaseimportcomplexpbrclassmain(ShowBase):def__init__(self):super().__init__()# apply a scene shader with PBR IBL# node can be base.render or any model node, intensity is the desired AO# (ambient occlusion reflection) intensity (float, 0.0 to 1.0)# you may wish to define a specific position in your scene where the# cube map is rendered from, to IE have multiple skyboxes preloaded# somewhere on the scene graph and have their reflections map to your# models -- to achieve this, set env_cam_pos=Vec3(your_pos)# you may set base.env_cam_pos after this, and it will update in realtime# env_res is the cube map resolution, can only be set once upon first callcomplexpbr.apply_shader(self.render)# complexpbr.screenspace_init()  # optional, starts the screenspace effects# apply_shader() with optional inputs# complexpbr.apply_shader(self.render, intensity=0.9, env_cam_pos=None, env_res=256, lut_fill=[1.0,0.0,0.0])# initialize complexpbr's screenspace effects (SSAO, SSR, AA, HSV color correction)# this replaces CommonFilters functionalitycomplexpbr.screenspace_init()# make the cubemap rendering static (performance boost)complexpbr.set_cubebuff_inactive()# make the cubemap rendering dynamic (this is the default state)complexpbr.set_cubebuff_active()# example of how to apply hardware skinningfp_character=actor_data.player_character# this is an Actor() modelfp_character.reparent_to(self.render)fp_character.set_scale(1)# set hardware skinning for the Actor()complexpbr.skin(fp_character)# example of how to use the vertex displacement mappingwood_sphere_3=loader.load_model('assets/models/wood_sphere_3.gltf')wood_sphere_3.reparent_to(base.render)wood_sphere_3.set_pos(0,0,1)dis_tex=Texture()dis_tex.read('assets/textures/WoodFloor057_2K-PNG/WoodFloor057_2K_Displacement.png')wood_sphere_3.set_shader_input('displacement_map',dis_tex)wood_sphere_3.set_shader_input('displacement_scale',0.1)# example of how to set up bloom -- complexpbr.screenspace_init() must have been called firstscreen_quad=base.screen_quadbloom_intensity=5.0# bloom defaults to 0.0 / offbloom_blur_width=10bloom_samples=6bloom_threshold=0.7screen_quad.set_shader_input("bloom_intensity",bloom_intensity)screen_quad.set_shader_input("bloom_threshold",bloom_threshold)screen_quad.set_shader_input("bloom_blur_width",bloom_blur_width)screen_quad.set_shader_input("bloom_samples",bloom_samples)# example of how to customize SSRssr_intensity=0.5ssr_step=4.0ssr_fresnel_pow=3.0ssr_samples=128# ssr_samples defaults to 0 / offscreen_quad.set_shader_input("ssr_intensity",ssr_intensity)screen_quad.set_shader_input("ssr_step",ssr_step)screen_quad.set_shader_input("ssr_fresnel_pow",ssr_fresnel_pow)screen_quad.set_shader_input("ssr_samples",ssr_samples)# example of how to customize SSAOssao_samples=32# ssao_samples defaults to 8screen_quad.set_shader_input("ssao_samples",ssao_samples)# example of how to HSV adjust the final imagescreen_quad.set_shader_input("hsv_g",1.3)# hsv_g (saturation factor) defaults to 1.0# example of how to modify the specular contributionself.render.set_shader_input("specular_factor",10.0)# the specular_factor defaults to 1.0# example of how to directly fill your BRDF LUT texture instead of providing one in your game foldercomplexpbr.apply_shader(base.render,1.0,env_res=1024,lut_fill=[1.0,0.0,0.0])# lut_fill=[red, green, blue]# if complexpbr.screenspace_init() has not been called, you may use CommonFilters# scene_filters = CommonFilters(base.win, base.cam)# scene_filters.set_bloom(size='medium')# scene_filters.set_exposure_adjust(1.1)# scene_filters.set_gamma_adjust(1.1)# scene_filters.set_blur_sharpen(0.9)Building:The module may be built using setuptools.python3setup.pybdist_wheelpip3install'path/to/panda3d-complexpbr.whl'Installing with PyPI:To-do.Future Project Goals:Function triggers for building new BRDF LUT samplers in realtimeInstallation over pipRequirements:panda3dVertex Displacement Mapping: