Path: blob/master/drivers/gles3/rasterizer_scene_gles3.h
22205 views
/**************************************************************************/1/* rasterizer_scene_gles3.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "platform_gl.h"33#ifdef GLES3_ENABLED3435#include "core/math/projection.h"36#include "core/templates/paged_allocator.h"37#include "core/templates/rid_owner.h"38#include "core/templates/self_list.h"39#include "drivers/gles3/shaders/effects/cubemap_filter.glsl.gen.h"40#include "drivers/gles3/shaders/sky.glsl.gen.h"41#include "scene/resources/mesh.h"42#include "servers/rendering/renderer_compositor.h"43#include "servers/rendering/renderer_scene_render.h"44#include "servers/rendering/rendering_server.h"45#include "shader_gles3.h"46#include "storage/light_storage.h"47#include "storage/material_storage.h"48#include "storage/render_scene_buffers_gles3.h"49#include "storage/utilities.h"5051enum RenderListType {52RENDER_LIST_OPAQUE, //used for opaque objects53RENDER_LIST_ALPHA, //used for transparent objects54RENDER_LIST_SECONDARY, //used for shadows and other objects55RENDER_LIST_MAX56};5758enum PassMode {59PASS_MODE_COLOR,60PASS_MODE_COLOR_TRANSPARENT,61PASS_MODE_SHADOW,62PASS_MODE_DEPTH,63PASS_MODE_MATERIAL,64PASS_MODE_MOTION_VECTORS,65};6667// These should share as much as possible with SkyUniform Location68enum SceneUniformLocation {69SCENE_TONEMAP_UNIFORM_LOCATION,70SCENE_GLOBALS_UNIFORM_LOCATION,71SCENE_DATA_UNIFORM_LOCATION,72SCENE_MATERIAL_UNIFORM_LOCATION,73SCENE_EMPTY1, // Unused, put here to avoid conflicts with SKY_DIRECTIONAL_LIGHT_UNIFORM_LOCATION.74SCENE_OMNILIGHT_UNIFORM_LOCATION,75SCENE_SPOTLIGHT_UNIFORM_LOCATION,76SCENE_DIRECTIONAL_LIGHT_UNIFORM_LOCATION,77SCENE_MULTIVIEW_UNIFORM_LOCATION,78SCENE_POSITIONAL_SHADOW_UNIFORM_LOCATION,79SCENE_DIRECTIONAL_SHADOW_UNIFORM_LOCATION,80SCENE_EMPTY2, // Unused, put here to avoid conflicts with SKY_MULTIVIEW_UNIFORM_LOCATION.81SCENE_PREV_DATA_UNIFORM_LOCATION,82SCENE_PREV_MULTIVIEW_UNIFORM_LOCATION,83};8485enum SkyUniformLocation {86SKY_TONEMAP_UNIFORM_LOCATION,87SKY_GLOBALS_UNIFORM_LOCATION,88SKY_EMPTY1, // Unused, put here to avoid conflicts with SCENE_DATA_UNIFORM_LOCATION.89SKY_MATERIAL_UNIFORM_LOCATION,90SKY_DIRECTIONAL_LIGHT_UNIFORM_LOCATION,91SKY_EMPTY2, // Unused, put here to avoid conflicts with SCENE_OMNILIGHT_UNIFORM_LOCATION.92SKY_EMPTY3, // Unused, put here to avoid conflicts with SCENE_SPOTLIGHT_UNIFORM_LOCATION.93SKY_EMPTY4, // Unused, put here to avoid conflicts with SCENE_DIRECTIONAL_LIGHT_UNIFORM_LOCATION.94SKY_EMPTY5, // Unused, put here to avoid conflicts with SCENE_MULTIVIEW_UNIFORM_LOCATION.95SKY_EMPTY6, // Unused, put here to avoid conflicts with SCENE_POSITIONAL_SHADOW_UNIFORM_LOCATION.96SKY_EMPTY7, // Unused, put here to avoid conflicts with SCENE_DIRECTIONAL_SHADOW_UNIFORM_LOCATION.97SKY_MULTIVIEW_UNIFORM_LOCATION,98SKY_EMPTY8, // Unused, put here to avoid conflicts with SCENE_PREV_DATA_UNIFORM_LOCATION.99SKY_EMPTY9, // Unused, put here to avoid conflicts with SCENE_PREV_MULTIVIEW_UNIFORM_LOCATION.100};101102struct RenderDataGLES3 {103Ref<RenderSceneBuffersGLES3> render_buffers;104bool transparent_bg = false;105Rect2i render_region;106107Transform3D cam_transform;108Transform3D inv_cam_transform;109Projection cam_projection;110bool cam_orthogonal = false;111bool cam_frustum = false;112uint32_t camera_visible_layers = 0xFFFFFFFF;113114// For billboards to cast correct shadows.115Transform3D main_cam_transform;116117// For stereo rendering118uint32_t view_count = 1;119Vector3 view_eye_offset[RendererSceneRender::MAX_RENDER_VIEWS];120Projection view_projection[RendererSceneRender::MAX_RENDER_VIEWS];121122float z_near = 0.0;123float z_far = 0.0;124125const PagedArray<RenderGeometryInstance *> *instances = nullptr;126const PagedArray<RID> *lights = nullptr;127const PagedArray<RID> *reflection_probes = nullptr;128RID environment;129RID camera_attributes;130RID shadow_atlas;131RID reflection_probe;132int reflection_probe_pass = 0;133134float lod_distance_multiplier = 0.0;135float screen_mesh_lod_threshold = 0.0;136137uint32_t directional_light_count = 0;138uint32_t directional_shadow_count = 0;139140uint32_t spot_light_count = 0;141uint32_t omni_light_count = 0;142143float luminance_multiplier = 1.0;144145RenderingMethod::RenderInfo *render_info = nullptr;146147/* Shadow data */148const RendererSceneRender::RenderShadowData *render_shadows = nullptr;149int render_shadow_count = 0;150};151152class RasterizerCanvasGLES3;153154class RasterizerSceneGLES3 : public RendererSceneRender {155private:156static RasterizerSceneGLES3 *singleton;157RS::ViewportDebugDraw debug_draw = RS::VIEWPORT_DEBUG_DRAW_DISABLED;158uint64_t scene_pass = 0;159160template <typename T>161struct InstanceSort {162float depth;163T *instance = nullptr;164bool operator<(const InstanceSort &p_sort) const {165return depth < p_sort.depth;166}167};168169struct SceneGlobals {170RID shader_default_version;171RID default_material;172RID default_shader;173RID overdraw_material;174RID overdraw_shader;175} scene_globals;176177GLES3::SceneMaterialData *default_material_data_ptr = nullptr;178GLES3::SceneMaterialData *overdraw_material_data_ptr = nullptr;179180/* LIGHT INSTANCE */181182struct LightData {183float position[3];184float inv_radius;185186float direction[3]; // Only used by SpotLight187float size;188189float color[3];190float attenuation;191192float inv_spot_attenuation;193float cos_spot_angle;194float specular_amount;195float shadow_opacity;196197float pad[3];198uint32_t bake_mode;199};200static_assert(sizeof(LightData) % 16 == 0, "LightData size must be a multiple of 16 bytes");201202struct DirectionalLightData {203float direction[3];204float energy;205206float color[3];207float size;208209uint32_t enabled : 1; // For use by SkyShaders210uint32_t bake_mode : 2;211float shadow_opacity;212float specular;213uint32_t mask;214};215static_assert(sizeof(DirectionalLightData) % 16 == 0, "DirectionalLightData size must be a multiple of 16 bytes");216217struct ShadowData {218float shadow_matrix[16];219220float light_position[3];221float shadow_normal_bias;222223float pad[3];224float shadow_atlas_pixel_size;225};226static_assert(sizeof(ShadowData) % 16 == 0, "ShadowData size must be a multiple of 16 bytes");227228struct DirectionalShadowData {229float direction[3];230float shadow_atlas_pixel_size;231float shadow_normal_bias[4];232float shadow_split_offsets[4];233float shadow_matrices[4][16];234float fade_from;235float fade_to;236uint32_t blend_splits; // Not exposed to the shader.237uint32_t pad;238};239static_assert(sizeof(DirectionalShadowData) % 16 == 0, "DirectionalShadowData size must be a multiple of 16 bytes");240241class GeometryInstanceGLES3;242243// Cached data for drawing surfaces244struct GeometryInstanceSurface {245enum {246FLAG_PASS_DEPTH = 1,247FLAG_PASS_OPAQUE = 2,248FLAG_PASS_ALPHA = 4,249FLAG_PASS_SHADOW = 8,250FLAG_USES_SHARED_SHADOW_MATERIAL = 128,251FLAG_USES_SCREEN_TEXTURE = 2048,252FLAG_USES_DEPTH_TEXTURE = 4096,253FLAG_USES_NORMAL_TEXTURE = 8192,254FLAG_USES_DOUBLE_SIDED_SHADOWS = 16384,255FLAG_USES_STENCIL = 32768,256};257258union {259struct {260uint64_t sort_key1;261uint64_t sort_key2;262};263struct {264uint64_t lod_index : 8;265uint64_t surface_index : 8;266uint64_t geometry_id : 32;267uint64_t material_id_low : 16;268269uint64_t material_id_hi : 16;270uint64_t shader_id : 32;271uint64_t uses_softshadow : 1;272uint64_t uses_projector : 1;273uint64_t uses_forward_gi : 1;274uint64_t uses_lightmap : 1;275uint64_t depth_layer : 4;276uint64_t priority : 8;277};278} sort;279280RS::PrimitiveType primitive = RS::PRIMITIVE_MAX;281uint32_t flags = 0;282uint32_t surface_index = 0;283uint32_t lod_index = 0;284uint32_t index_count = 0;285int32_t light_pass_index = -1;286bool finished_base_pass = false;287288void *surface = nullptr;289GLES3::SceneShaderData *shader = nullptr;290GLES3::SceneMaterialData *material = nullptr;291292void *surface_shadow = nullptr;293GLES3::SceneShaderData *shader_shadow = nullptr;294GLES3::SceneMaterialData *material_shadow = nullptr;295296GeometryInstanceSurface *next = nullptr;297GeometryInstanceGLES3 *owner = nullptr;298};299300struct GeometryInstanceLightmapSH {301Color sh[9];302};303304class GeometryInstanceGLES3 : public RenderGeometryInstanceBase {305public:306//used during rendering307bool store_transform_cache = true;308309// Used for generating motion vectors.310Transform3D prev_transform;311bool is_prev_transform_stored = false;312313int32_t instance_count = 0;314315bool can_sdfgi = false;316bool using_projectors = false;317bool using_softshadows = false;318319struct LightPass {320int32_t light_id = -1; // Position in the light uniform buffer.321int32_t shadow_id = -1; // Position in the shadow uniform buffer.322RID light_instance_rid;323bool is_omni = false;324};325326LocalVector<LightPass> light_passes;327328uint32_t paired_omni_light_count = 0;329uint32_t paired_spot_light_count = 0;330LocalVector<RID> paired_omni_lights;331LocalVector<RID> paired_spot_lights;332LocalVector<uint32_t> omni_light_gl_cache;333LocalVector<uint32_t> spot_light_gl_cache;334335LocalVector<RID> paired_reflection_probes;336LocalVector<RID> reflection_probe_rid_cache;337LocalVector<Transform3D> reflection_probes_local_transform_cache;338339RID lightmap_instance;340Rect2 lightmap_uv_scale;341uint32_t lightmap_slice_index;342GeometryInstanceLightmapSH *lightmap_sh = nullptr;343344// Used during setup.345GeometryInstanceSurface *surface_caches = nullptr;346SelfList<GeometryInstanceGLES3> dirty_list_element;347348GeometryInstanceGLES3() :349dirty_list_element(this) {}350351virtual void _mark_dirty() override;352virtual void set_use_lightmap(RID p_lightmap_instance, const Rect2 &p_lightmap_uv_scale, int p_lightmap_slice_index) override;353virtual void set_lightmap_capture(const Color *p_sh9) override;354355virtual void clear_light_instances() override;356virtual void pair_light_instance(const RID p_light_instance, RS::LightType light_type, uint32_t placement_idx) override;357virtual void pair_reflection_probe_instances(const RID *p_reflection_probe_instances, uint32_t p_reflection_probe_instance_count) override;358virtual void pair_decal_instances(const RID *p_decal_instances, uint32_t p_decal_instance_count) override {}359virtual void pair_voxel_gi_instances(const RID *p_voxel_gi_instances, uint32_t p_voxel_gi_instance_count) override {}360361virtual void set_softshadow_projector_pairing(bool p_softshadow, bool p_projector) override {}362};363364virtual uint32_t get_max_lights_total() override;365virtual uint32_t get_max_lights_per_mesh() override;366367enum {368INSTANCE_DATA_FLAGS_DYNAMIC = 1 << 3,369INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 4,370INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 5,371INSTANCE_DATA_FLAG_USE_LIGHTMAP_CAPTURE = 1 << 7,372INSTANCE_DATA_FLAG_USE_LIGHTMAP = 1 << 8,373INSTANCE_DATA_FLAG_USE_SH_LIGHTMAP = 1 << 9,374INSTANCE_DATA_FLAG_USE_VOXEL_GI = 1 << 10,375INSTANCE_DATA_FLAG_PARTICLES = 1 << 11,376INSTANCE_DATA_FLAG_MULTIMESH = 1 << 12,377INSTANCE_DATA_FLAG_MULTIMESH_FORMAT_2D = 1 << 13,378INSTANCE_DATA_FLAG_MULTIMESH_HAS_COLOR = 1 << 14,379INSTANCE_DATA_FLAG_MULTIMESH_HAS_CUSTOM_DATA = 1 << 15,380};381382static void _geometry_instance_dependency_changed(Dependency::DependencyChangedNotification p_notification, DependencyTracker *p_tracker);383static void _geometry_instance_dependency_deleted(const RID &p_dependency, DependencyTracker *p_tracker);384385SelfList<GeometryInstanceGLES3>::List geometry_instance_dirty_list;386387// Use PagedAllocator instead of RID to maximize performance388PagedAllocator<GeometryInstanceGLES3> geometry_instance_alloc;389PagedAllocator<GeometryInstanceSurface> geometry_instance_surface_alloc;390391void _geometry_instance_add_surface_with_material(GeometryInstanceGLES3 *ginstance, uint32_t p_surface, GLES3::SceneMaterialData *p_material, uint32_t p_material_id, uint32_t p_shader_id, RID p_mesh);392void _geometry_instance_add_surface_with_material_chain(GeometryInstanceGLES3 *ginstance, uint32_t p_surface, GLES3::SceneMaterialData *p_material, RID p_mat_src, RID p_mesh);393void _geometry_instance_add_surface(GeometryInstanceGLES3 *ginstance, uint32_t p_surface, RID p_material, RID p_mesh);394void _geometry_instance_update(RenderGeometryInstance *p_geometry_instance);395void _update_dirty_geometry_instances();396397struct SceneState {398struct UBO {399float projection_matrix[16];400float inv_projection_matrix[16];401float inv_view_matrix[16];402float view_matrix[16];403404float main_cam_inv_view_matrix[16];405406float viewport_size[2];407float screen_pixel_size[2];408409float ambient_light_color_energy[4];410411float ambient_color_sky_mix;412uint32_t directional_shadow_count;413float emissive_exposure_normalization;414uint32_t use_ambient_light = 0;415416uint32_t use_ambient_cubemap = 0;417uint32_t use_reflection_cubemap = 0;418float fog_aerial_perspective;419float time;420421float radiance_inverse_xform[12];422423uint32_t directional_light_count;424float z_far;425float z_near;426float IBL_exposure_normalization;427428uint32_t fog_enabled;429uint32_t fog_mode;430float fog_density;431float fog_height;432433float fog_height_density;434float fog_depth_curve;435float fog_sun_scatter;436float fog_depth_begin;437438float fog_light_color[3];439float fog_depth_end;440441float shadow_bias;442float luminance_multiplier;443uint32_t camera_visible_layers;444bool pancake_shadows;445};446static_assert(sizeof(UBO) % 16 == 0, "Scene UBO size must be a multiple of 16 bytes");447static_assert(sizeof(UBO) < 16384, "Scene UBO size must be 16384 bytes or smaller");448449struct MultiviewUBO {450float projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16];451float inv_projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16];452float eye_offset[RendererSceneRender::MAX_RENDER_VIEWS][4];453};454static_assert(sizeof(MultiviewUBO) % 16 == 0, "Multiview UBO size must be a multiple of 16 bytes");455static_assert(sizeof(MultiviewUBO) < 16384, "MultiviewUBO size must be 16384 bytes or smaller");456457struct TonemapUBO {458float exposure = 1.0;459int32_t tonemapper = 0;460int32_t pad = 0;461int32_t pad2 = 0;462float tonemapper_params[4] = { 0.0, 0.0, 0.0, 0.0 };463float brightness = 1.0;464float contrast = 1.0;465float saturation = 1.0;466int32_t pad3 = 0;467};468static_assert(sizeof(TonemapUBO) % 16 == 0, "Tonemap UBO size must be a multiple of 16 bytes");469470UBO data;471UBO prev_data;472GLuint ubo_buffer = 0;473GLuint prev_ubo_buffer = 0;474MultiviewUBO multiview_data;475MultiviewUBO prev_multiview_data;476GLuint multiview_buffer = 0;477GLuint prev_multiview_buffer = 0;478GLuint tonemap_buffer = 0;479480int prev_data_state = 0; // 0 = Motion vectors not used, 1 = use data (first frame only), 2 = use previous data481482bool used_depth_prepass = false;483484GLES3::SceneShaderData::BlendMode current_blend_mode = GLES3::SceneShaderData::BLEND_MODE_MIX;485RS::CullMode cull_mode = RS::CULL_MODE_BACK;486GLenum current_depth_function = GL_GEQUAL;487488bool current_blend_enabled = false;489bool current_depth_draw_enabled = false;490bool current_depth_test_enabled = false;491bool current_scissor_test_enabled = false;492493void reset_gl_state() {494glDisable(GL_BLEND);495current_blend_enabled = false;496497glDisable(GL_SCISSOR_TEST);498current_scissor_test_enabled = false;499500glCullFace(GL_BACK);501glEnable(GL_CULL_FACE);502cull_mode = RS::CULL_MODE_BACK;503504glDepthMask(GL_FALSE);505current_depth_draw_enabled = false;506glDisable(GL_DEPTH_TEST);507current_depth_test_enabled = false;508509glDepthFunc(GL_GEQUAL);510current_depth_function = GL_GEQUAL;511512glDisable(GL_STENCIL_TEST);513current_stencil_test_enabled = false;514glStencilMask(255);515current_stencil_write_mask = 255;516glStencilFunc(GL_ALWAYS, 0, 255);517current_stencil_compare = GL_ALWAYS;518current_stencil_reference = 0;519current_stencil_compare_mask = 255;520}521522void set_gl_cull_mode(RS::CullMode p_mode) {523if (cull_mode != p_mode) {524if (p_mode == RS::CULL_MODE_DISABLED) {525glDisable(GL_CULL_FACE);526} else {527if (cull_mode == RS::CULL_MODE_DISABLED) {528// Last time was disabled, so enable and set proper face.529glEnable(GL_CULL_FACE);530}531glCullFace(p_mode == RS::CULL_MODE_FRONT ? GL_FRONT : GL_BACK);532}533cull_mode = p_mode;534}535}536537void enable_gl_blend(bool p_enabled) {538if (current_blend_enabled != p_enabled) {539if (p_enabled) {540glEnable(GL_BLEND);541} else {542glDisable(GL_BLEND);543}544current_blend_enabled = p_enabled;545}546}547548void enable_gl_scissor_test(bool p_enabled) {549if (current_scissor_test_enabled != p_enabled) {550if (p_enabled) {551glEnable(GL_SCISSOR_TEST);552} else {553glDisable(GL_SCISSOR_TEST);554}555current_scissor_test_enabled = p_enabled;556}557}558559void enable_gl_depth_draw(bool p_enabled) {560if (current_depth_draw_enabled != p_enabled) {561glDepthMask(p_enabled ? GL_TRUE : GL_FALSE);562current_depth_draw_enabled = p_enabled;563}564}565566void enable_gl_depth_test(bool p_enabled) {567if (current_depth_test_enabled != p_enabled) {568if (p_enabled) {569glEnable(GL_DEPTH_TEST);570} else {571glDisable(GL_DEPTH_TEST);572}573current_depth_test_enabled = p_enabled;574}575}576577void set_gl_depth_func(GLenum p_depth_func) {578if (current_depth_function != p_depth_func) {579glDepthFunc(p_depth_func);580current_depth_function = p_depth_func;581}582}583584void enable_gl_stencil_test(bool p_enabled) {585if (current_stencil_test_enabled != p_enabled) {586if (p_enabled) {587glEnable(GL_STENCIL_TEST);588} else {589glDisable(GL_STENCIL_TEST);590}591current_stencil_test_enabled = p_enabled;592}593}594595void set_gl_stencil_func(GLenum p_compare, GLint p_reference, GLenum p_compare_mask) {596if (current_stencil_compare != p_compare || current_stencil_reference != p_reference || current_stencil_compare_mask != p_compare_mask) {597glStencilFunc(p_compare, p_reference, p_compare_mask);598current_stencil_compare = p_compare;599current_stencil_reference = p_reference;600current_stencil_compare_mask = p_compare_mask;601}602}603604void set_gl_stencil_write_mask(GLuint p_mask) {605if (current_stencil_write_mask != p_mask) {606glStencilMask(p_mask);607current_stencil_write_mask = p_mask;608}609}610611void set_gl_stencil_op(GLenum p_op_fail, GLenum p_op_dpfail, GLenum p_op_dppass) {612if (current_stencil_op_fail != p_op_fail || current_stencil_op_dpfail != p_op_dpfail || current_stencil_op_dppass != p_op_dppass) {613glStencilOp(p_op_fail, p_op_dpfail, p_op_dppass);614current_stencil_op_fail = p_op_fail;615current_stencil_op_dpfail = p_op_dpfail;616current_stencil_op_dppass = p_op_dppass;617}618}619620GLenum current_stencil_compare = GL_ALWAYS;621GLuint current_stencil_compare_mask = 255;622GLuint current_stencil_write_mask = 255;623GLint current_stencil_reference = 0;624GLenum current_stencil_op_fail = GL_KEEP;625GLenum current_stencil_op_dpfail = GL_KEEP;626GLenum current_stencil_op_dppass = GL_KEEP;627bool current_stencil_test_enabled = false;628629bool texscreen_copied = false;630bool used_screen_texture = false;631bool used_normal_texture = false;632bool used_depth_texture = false;633bool used_opaque_stencil = false;634635LightData *omni_lights = nullptr;636LightData *spot_lights = nullptr;637ShadowData *positional_shadows = nullptr;638639InstanceSort<GLES3::LightInstance> *omni_light_sort;640InstanceSort<GLES3::LightInstance> *spot_light_sort;641GLuint omni_light_buffer = 0;642GLuint spot_light_buffer = 0;643GLuint positional_shadow_buffer = 0;644uint32_t omni_light_count = 0;645uint32_t spot_light_count = 0;646RS::ShadowQuality positional_shadow_quality = RS::ShadowQuality::SHADOW_QUALITY_SOFT_LOW;647648DirectionalLightData *directional_lights = nullptr;649GLuint directional_light_buffer = 0;650DirectionalShadowData *directional_shadows = nullptr;651GLuint directional_shadow_buffer = 0;652RS::ShadowQuality directional_shadow_quality = RS::ShadowQuality::SHADOW_QUALITY_SOFT_LOW;653} scene_state;654655struct RenderListParameters {656GeometryInstanceSurface **elements = nullptr;657int element_count = 0;658bool reverse_cull = false;659uint64_t spec_constant_base_flags = 0;660bool force_wireframe = false;661Vector2 uv_offset = Vector2(0, 0);662663RenderListParameters(GeometryInstanceSurface **p_elements, int p_element_count, bool p_reverse_cull, uint64_t p_spec_constant_base_flags, bool p_force_wireframe = false, Vector2 p_uv_offset = Vector2()) {664elements = p_elements;665element_count = p_element_count;666reverse_cull = p_reverse_cull;667spec_constant_base_flags = p_spec_constant_base_flags;668force_wireframe = p_force_wireframe;669uv_offset = p_uv_offset;670}671};672673struct RenderList {674LocalVector<GeometryInstanceSurface *> elements;675676void clear() {677elements.clear();678}679680//should eventually be replaced by radix681682struct SortByKey {683_FORCE_INLINE_ bool operator()(const GeometryInstanceSurface *A, const GeometryInstanceSurface *B) const {684return (A->sort.sort_key2 == B->sort.sort_key2) ? (A->sort.sort_key1 < B->sort.sort_key1) : (A->sort.sort_key2 < B->sort.sort_key2);685}686};687688void sort_by_key() {689SortArray<GeometryInstanceSurface *, SortByKey> sorter;690sorter.sort(elements.ptr(), elements.size());691}692693void sort_by_key_range(uint32_t p_from, uint32_t p_size) {694SortArray<GeometryInstanceSurface *, SortByKey> sorter;695sorter.sort(elements.ptr() + p_from, p_size);696}697698struct SortByDepth {699_FORCE_INLINE_ bool operator()(const GeometryInstanceSurface *A, const GeometryInstanceSurface *B) const {700return (A->owner->depth < B->owner->depth);701}702};703704void sort_by_depth() { //used for shadows705706SortArray<GeometryInstanceSurface *, SortByDepth> sorter;707sorter.sort(elements.ptr(), elements.size());708}709710struct SortByReverseDepthAndPriority {711_FORCE_INLINE_ bool operator()(const GeometryInstanceSurface *A, const GeometryInstanceSurface *B) const {712return (A->sort.priority == B->sort.priority) ? (A->owner->depth > B->owner->depth) : (A->sort.priority < B->sort.priority);713}714};715716void sort_by_reverse_depth_and_priority() { //used for alpha717718SortArray<GeometryInstanceSurface *, SortByReverseDepthAndPriority> sorter;719sorter.sort(elements.ptr(), elements.size());720}721722_FORCE_INLINE_ void add_element(GeometryInstanceSurface *p_element) {723elements.push_back(p_element);724}725};726727RenderList render_list[RENDER_LIST_MAX];728729void _update_scene_ubo(GLuint &p_ubo_buffer, GLuint p_index, uint32_t p_size, const void *p_source_data, String p_name = "");730731void _setup_lights(const RenderDataGLES3 *p_render_data, bool p_using_shadows, uint32_t &r_directional_light_count, uint32_t &r_omni_light_count, uint32_t &r_spot_light_count, uint32_t &r_directional_shadow_count);732void _setup_environment(const RenderDataGLES3 *p_render_data, bool p_no_fog, const Size2i &p_screen_size, bool p_flip_y, const Color &p_default_bg_color, bool p_pancake_shadows, float p_shadow_bias = 0.0);733void _fill_render_list(RenderListType p_render_list, const RenderDataGLES3 *p_render_data, PassMode p_pass_mode, bool p_append = false);734void _render_shadows(const RenderDataGLES3 *p_render_data, const Size2i &p_viewport_size = Size2i(1, 1));735void _render_shadow_pass(RID p_light, RID p_shadow_atlas, int p_pass, const PagedArray<RenderGeometryInstance *> &p_instances, float p_lod_distance_multiplier = 0, float p_screen_mesh_lod_threshold = 0.0, RenderingMethod::RenderInfo *p_render_info = nullptr, const Size2i &p_viewport_size = Size2i(1, 1), const Transform3D &p_main_cam_transform = Transform3D());736void _render_post_processing(const RenderDataGLES3 *p_render_data);737738template <PassMode p_pass_mode>739_FORCE_INLINE_ void _render_list_template(RenderListParameters *p_params, const RenderDataGLES3 *p_render_data, uint32_t p_from_element, uint32_t p_to_element, bool p_alpha_pass = false);740741protected:742double time;743double time_step = 0;744745bool screen_space_roughness_limiter = false;746float screen_space_roughness_limiter_amount = 0.25;747float screen_space_roughness_limiter_limit = 0.18;748749void _render_buffers_debug_draw(Ref<RenderSceneBuffersGLES3> p_render_buffers, RID p_shadow_atlas, GLuint p_fbo);750751/* Camera Attributes */752753struct CameraAttributes {754float exposure_multiplier = 1.0;755float exposure_normalization = 1.0;756};757758bool use_physical_light_units = false;759mutable RID_Owner<CameraAttributes, true> camera_attributes_owner;760761/* Environment */762763RS::EnvironmentSSAOQuality ssao_quality = RS::ENV_SSAO_QUALITY_MEDIUM;764bool ssao_half_size = false;765float ssao_adaptive_target = 0.5;766int ssao_blur_passes = 2;767float ssao_fadeout_from = 50.0;768float ssao_fadeout_to = 300.0;769770bool glow_bicubic_upscale = false;771772bool lightmap_bicubic_upscale = false;773774/* Sky */775776struct SkyGlobals {777float fog_aerial_perspective = 0.0;778Color fog_light_color;779float fog_sun_scatter = 0.0;780bool fog_enabled = false;781float fog_density = 0.0;782float z_far = 0.0;783uint32_t directional_light_count = 0;784785DirectionalLightData *directional_lights = nullptr;786DirectionalLightData *last_frame_directional_lights = nullptr;787uint32_t last_frame_directional_light_count = 0;788GLuint directional_light_buffer = 0;789790RID shader_default_version;791RID default_material;792RID default_shader;793RID fog_material;794RID fog_shader;795GLuint screen_triangle = 0;796GLuint screen_triangle_array = 0;797uint32_t max_directional_lights = 4;798uint32_t roughness_layers = 8;799} sky_globals;800801struct Sky {802// Screen Buffers803GLuint half_res_pass = 0;804GLuint half_res_framebuffer = 0;805GLuint quarter_res_pass = 0;806GLuint quarter_res_framebuffer = 0;807Size2i screen_size = Size2i(0, 0);808809// Radiance Cubemap810GLuint radiance = 0;811GLuint radiance_framebuffer = 0;812GLuint raw_radiance = 0;813814RID material;815GLuint uniform_buffer;816817int radiance_size = 256;818int mipmap_count = 1;819820RS::SkyMode mode = RS::SKY_MODE_AUTOMATIC;821822//ReflectionData reflection;823bool reflection_dirty = false;824bool dirty = false;825int processing_layer = 0;826Sky *dirty_list = nullptr;827float baked_exposure = 1.0;828829//State to track when radiance cubemap needs updating830GLES3::SkyMaterialData *prev_material = nullptr;831Vector3 prev_position = Vector3(0.0, 0.0, 0.0);832float prev_time = 0.0f;833};834835Sky *dirty_sky_list = nullptr;836mutable RID_Owner<Sky, true> sky_owner;837838void _setup_sky(const RenderDataGLES3 *p_render_data, const PagedArray<RID> &p_lights, const Projection &p_projection, const Transform3D &p_transform, const Size2i p_screen_size);839void _invalidate_sky(Sky *p_sky);840void _update_dirty_skys();841void _update_sky_radiance(RID p_env, const Projection &p_projection, const Transform3D &p_transform, float p_sky_energy_multiplier);842void _draw_sky(RID p_env, const Projection &p_projection, const Transform3D &p_transform, float p_sky_energy_multiplier, float p_luminance_multiplier, bool p_use_multiview, bool p_flip_y, bool p_apply_color_adjustments_in_post);843void _free_sky_data(Sky *p_sky);844845// Needed for a single argument calls (material and uv2).846PagedArrayPool<RenderGeometryInstance *> cull_argument_pool;847PagedArray<RenderGeometryInstance *> cull_argument;848849public:850static RasterizerSceneGLES3 *get_singleton() { return singleton; }851852RasterizerCanvasGLES3 *canvas = nullptr;853854RenderGeometryInstance *geometry_instance_create(RID p_base) override;855void geometry_instance_free(RenderGeometryInstance *p_geometry_instance) override;856857uint32_t geometry_instance_get_pair_mask() override;858859/* PIPELINES */860861virtual void mesh_generate_pipelines(RID p_mesh, bool p_background_compilation) override {}862virtual uint32_t get_pipeline_compilations(RS::PipelineSource p_source) override { return 0; }863864/* SDFGI UPDATE */865866void sdfgi_update(const Ref<RenderSceneBuffers> &p_render_buffers, RID p_environment, const Vector3 &p_world_position) override {}867int sdfgi_get_pending_region_count(const Ref<RenderSceneBuffers> &p_render_buffers) const override {868return 0;869}870AABB sdfgi_get_pending_region_bounds(const Ref<RenderSceneBuffers> &p_render_buffers, int p_region) const override {871return AABB();872}873uint32_t sdfgi_get_pending_region_cascade(const Ref<RenderSceneBuffers> &p_render_buffers, int p_region) const override {874return 0;875}876877/* SKY API */878879RID sky_allocate() override;880void sky_initialize(RID p_rid) override;881void sky_set_radiance_size(RID p_sky, int p_radiance_size) override;882void sky_set_mode(RID p_sky, RS::SkyMode p_mode) override;883void sky_set_material(RID p_sky, RID p_material) override;884Ref<Image> sky_bake_panorama(RID p_sky, float p_energy, bool p_bake_irradiance, const Size2i &p_size) override;885float sky_get_baked_exposure(RID p_sky) const;886887/* ENVIRONMENT API */888889void environment_glow_set_use_bicubic_upscale(bool p_enable) override;890891void environment_set_ssr_half_size(bool p_half_size) override;892void environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) override;893894void environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override;895896void environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override;897898void environment_set_sdfgi_ray_count(RS::EnvironmentSDFGIRayCount p_ray_count) override;899void environment_set_sdfgi_frames_to_converge(RS::EnvironmentSDFGIFramesToConverge p_frames) override;900void environment_set_sdfgi_frames_to_update_light(RS::EnvironmentSDFGIFramesToUpdateLight p_update) override;901902void environment_set_volumetric_fog_volume_size(int p_size, int p_depth) override;903void environment_set_volumetric_fog_filter_active(bool p_enable) override;904905Ref<Image> environment_bake_panorama(RID p_env, bool p_bake_irradiance, const Size2i &p_size) override;906907_FORCE_INLINE_ bool is_using_physical_light_units() {908return use_physical_light_units;909}910911void positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override;912void directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override;913914RID fog_volume_instance_create(RID p_fog_volume) override;915void fog_volume_instance_set_transform(RID p_fog_volume_instance, const Transform3D &p_transform) override;916void fog_volume_instance_set_active(RID p_fog_volume_instance, bool p_active) override;917RID fog_volume_instance_get_volume(RID p_fog_volume_instance) const override;918Vector3 fog_volume_instance_get_position(RID p_fog_volume_instance) const override;919920RID voxel_gi_instance_create(RID p_voxel_gi) override;921void voxel_gi_instance_set_transform_to_data(RID p_probe, const Transform3D &p_xform) override;922bool voxel_gi_needs_update(RID p_probe) const override;923void voxel_gi_update(RID p_probe, bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RenderGeometryInstance *> &p_dynamic_objects) override;924925void voxel_gi_set_quality(RS::VoxelGIQuality) override;926927void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_compositor, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, float p_window_output_max_value, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RenderingMethod::RenderInfo *r_render_info = nullptr) override;928void render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) override;929void render_particle_collider_heightfield(RID p_collider, const Transform3D &p_transform, const PagedArray<RenderGeometryInstance *> &p_instances) override;930931void set_scene_pass(uint64_t p_pass) override {932scene_pass = p_pass;933}934935_FORCE_INLINE_ uint64_t get_scene_pass() {936return scene_pass;937}938939void set_time(double p_time, double p_step) override;940void set_debug_draw_mode(RS::ViewportDebugDraw p_debug_draw) override;941_FORCE_INLINE_ RS::ViewportDebugDraw get_debug_draw_mode() const {942return debug_draw;943}944945Ref<RenderSceneBuffers> render_buffers_create() override;946void gi_set_use_half_resolution(bool p_enable) override;947948void screen_space_roughness_limiter_set_active(bool p_enable, float p_amount, float p_curve) override;949bool screen_space_roughness_limiter_is_active() const override;950951void sub_surface_scattering_set_quality(RS::SubSurfaceScatteringQuality p_quality) override;952void sub_surface_scattering_set_scale(float p_scale, float p_depth_scale) override;953954TypedArray<Image> bake_render_uv2(RID p_base, const TypedArray<RID> &p_material_overrides, const Size2i &p_image_size) override;955void _render_uv2(const PagedArray<RenderGeometryInstance *> &p_instances, GLuint p_framebuffer, const Rect2i &p_region);956957bool free(RID p_rid) override;958void update() override;959void sdfgi_set_debug_probe_select(const Vector3 &p_position, const Vector3 &p_dir) override;960961void decals_set_filter(RS::DecalFilter p_filter) override;962void light_projectors_set_filter(RS::LightProjectorFilter p_filter) override;963virtual void lightmaps_set_bicubic_filter(bool p_enable) override;964virtual void material_set_use_debanding(bool p_enable) override;965966RasterizerSceneGLES3();967~RasterizerSceneGLES3();968};969970#endif // GLES3_ENABLED971972973