fog.cpp 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208
  1. /**************************************************************************/
  2. /* fog.cpp */
  3. /**************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /**************************************************************************/
  8. /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
  9. /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /**************************************************************************/
  30. #include "fog.h"
  31. #include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
  32. #include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
  33. #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
  34. #include "servers/rendering/rendering_server_default.h"
  35. using namespace RendererRD;
  36. Fog *Fog::singleton = nullptr;
  37. Fog::Fog() {
  38. singleton = this;
  39. }
  40. Fog::~Fog() {
  41. singleton = nullptr;
  42. }
  43. int Fog::_get_fog_shader_group() {
  44. RenderingDevice *rd = RD::get_singleton();
  45. bool use_32_bit_atomics = rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT);
  46. bool use_vulkan_memory_model = rd->has_feature(RD::SUPPORTS_VULKAN_MEMORY_MODEL);
  47. if (use_vulkan_memory_model) {
  48. return use_32_bit_atomics ? VolumetricFogShader::SHADER_GROUP_VULKAN_MEMORY_MODEL : VolumetricFogShader::SHADER_GROUP_VULKAN_MEMORY_MODEL_NO_ATOMICS;
  49. } else {
  50. return use_32_bit_atomics ? VolumetricFogShader::SHADER_GROUP_BASE : VolumetricFogShader::SHADER_GROUP_NO_ATOMICS;
  51. }
  52. }
  53. int Fog::_get_fog_variant() {
  54. RenderingDevice *rd = RD::get_singleton();
  55. bool use_32_bit_atomics = rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT);
  56. bool use_vulkan_memory_model = rd->has_feature(RD::SUPPORTS_VULKAN_MEMORY_MODEL);
  57. return (use_vulkan_memory_model ? 2 : 0) + (use_32_bit_atomics ? 0 : 1);
  58. }
  59. int Fog::_get_fog_process_variant(int p_idx) {
  60. RenderingDevice *rd = RD::get_singleton();
  61. bool use_32_bit_atomics = rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT);
  62. bool use_vulkan_memory_model = rd->has_feature(RD::SUPPORTS_VULKAN_MEMORY_MODEL);
  63. return (use_vulkan_memory_model ? (VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_MAX * 2) : 0) + (use_32_bit_atomics ? 0 : VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_MAX) + p_idx;
  64. }
  65. /* FOG VOLUMES */
  66. RID Fog::fog_volume_allocate() {
  67. return fog_volume_owner.allocate_rid();
  68. }
  69. void Fog::fog_volume_initialize(RID p_rid) {
  70. fog_volume_owner.initialize_rid(p_rid, FogVolume());
  71. }
  72. void Fog::fog_volume_free(RID p_rid) {
  73. FogVolume *fog_volume = fog_volume_owner.get_or_null(p_rid);
  74. fog_volume->dependency.deleted_notify(p_rid);
  75. fog_volume_owner.free(p_rid);
  76. }
  77. Dependency *Fog::fog_volume_get_dependency(RID p_fog_volume) const {
  78. FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
  79. ERR_FAIL_NULL_V(fog_volume, nullptr);
  80. return &fog_volume->dependency;
  81. }
  82. void Fog::fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) {
  83. FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
  84. ERR_FAIL_NULL(fog_volume);
  85. if (p_shape == fog_volume->shape) {
  86. return;
  87. }
  88. fog_volume->shape = p_shape;
  89. fog_volume->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
  90. }
  91. void Fog::fog_volume_set_size(RID p_fog_volume, const Vector3 &p_size) {
  92. FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
  93. ERR_FAIL_NULL(fog_volume);
  94. fog_volume->size = p_size;
  95. fog_volume->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
  96. }
  97. void Fog::fog_volume_set_material(RID p_fog_volume, RID p_material) {
  98. FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
  99. ERR_FAIL_NULL(fog_volume);
  100. fog_volume->material = p_material;
  101. }
  102. RID Fog::fog_volume_get_material(RID p_fog_volume) const {
  103. FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
  104. ERR_FAIL_NULL_V(fog_volume, RID());
  105. return fog_volume->material;
  106. }
  107. RS::FogVolumeShape Fog::fog_volume_get_shape(RID p_fog_volume) const {
  108. FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
  109. ERR_FAIL_NULL_V(fog_volume, RS::FOG_VOLUME_SHAPE_BOX);
  110. return fog_volume->shape;
  111. }
  112. AABB Fog::fog_volume_get_aabb(RID p_fog_volume) const {
  113. FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
  114. ERR_FAIL_NULL_V(fog_volume, AABB());
  115. switch (fog_volume->shape) {
  116. case RS::FOG_VOLUME_SHAPE_ELLIPSOID:
  117. case RS::FOG_VOLUME_SHAPE_CONE:
  118. case RS::FOG_VOLUME_SHAPE_CYLINDER:
  119. case RS::FOG_VOLUME_SHAPE_BOX: {
  120. AABB aabb;
  121. aabb.position = -fog_volume->size / 2;
  122. aabb.size = fog_volume->size;
  123. return aabb;
  124. }
  125. default: {
  126. // Need some size otherwise will get culled
  127. return AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2));
  128. }
  129. }
  130. }
  131. Vector3 Fog::fog_volume_get_size(RID p_fog_volume) const {
  132. const FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
  133. ERR_FAIL_NULL_V(fog_volume, Vector3());
  134. return fog_volume->size;
  135. }
  136. ////////////////////////////////////////////////////////////////////////////////
  137. // Fog material
  138. bool Fog::FogMaterialData::update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty) {
  139. uniform_set_updated = true;
  140. return update_parameters_uniform_set(p_parameters, p_uniform_dirty, p_textures_dirty, shader_data->uniforms, shader_data->ubo_offsets.ptr(), shader_data->texture_uniforms, shader_data->default_texture_params, shader_data->ubo_size, uniform_set, Fog::get_singleton()->volumetric_fog.shader.version_get_shader(shader_data->version, _get_fog_variant()), VolumetricFogShader::FogSet::FOG_SET_MATERIAL, true, true);
  141. }
  142. Fog::FogMaterialData::~FogMaterialData() {
  143. free_parameters_uniform_set(uniform_set);
  144. }
  145. RendererRD::MaterialStorage::ShaderData *Fog::_create_fog_shader_func() {
  146. FogShaderData *shader_data = memnew(FogShaderData);
  147. return shader_data;
  148. }
  149. RendererRD::MaterialStorage::ShaderData *Fog::_create_fog_shader_funcs() {
  150. return Fog::get_singleton()->_create_fog_shader_func();
  151. }
  152. RendererRD::MaterialStorage::MaterialData *Fog::_create_fog_material_func(FogShaderData *p_shader) {
  153. FogMaterialData *material_data = memnew(FogMaterialData);
  154. material_data->shader_data = p_shader;
  155. //update will happen later anyway so do nothing.
  156. return material_data;
  157. }
  158. RendererRD::MaterialStorage::MaterialData *Fog::_create_fog_material_funcs(RendererRD::MaterialStorage::ShaderData *p_shader) {
  159. return Fog::get_singleton()->_create_fog_material_func(static_cast<FogShaderData *>(p_shader));
  160. }
  161. ////////////////////////////////////////////////////////////////////////////////
  162. // FOG VOLUMES INSTANCE
  163. RID Fog::fog_volume_instance_create(RID p_fog_volume) {
  164. FogVolumeInstance fvi;
  165. fvi.volume = p_fog_volume;
  166. return fog_volume_instance_owner.make_rid(fvi);
  167. }
  168. void Fog::fog_instance_free(RID p_rid) {
  169. fog_volume_instance_owner.free(p_rid);
  170. }
  171. ////////////////////////////////////////////////////////////////////////////////
  172. // Volumetric Fog Shader
  173. void Fog::init_fog_shader(uint32_t p_max_directional_lights, int p_roughness_layers, bool p_is_using_radiance_octmap_array) {
  174. MaterialStorage *material_storage = MaterialStorage::get_singleton();
  175. {
  176. String defines = "#define SAMPLERS_BINDING_FIRST_INDEX " + itos(SAMPLERS_BINDING_FIRST_INDEX) + "\n";
  177. // Initialize local fog shader
  178. Vector<ShaderRD::VariantDefine> volumetric_fog_modes;
  179. volumetric_fog_modes.push_back(ShaderRD::VariantDefine(VolumetricFogShader::SHADER_GROUP_BASE, "", false));
  180. volumetric_fog_modes.push_back(ShaderRD::VariantDefine(VolumetricFogShader::SHADER_GROUP_NO_ATOMICS, "#define NO_IMAGE_ATOMICS\n", false));
  181. volumetric_fog_modes.push_back(ShaderRD::VariantDefine(VolumetricFogShader::SHADER_GROUP_VULKAN_MEMORY_MODEL, "#define USE_VULKAN_MEMORY_MODEL\n", false));
  182. volumetric_fog_modes.push_back(ShaderRD::VariantDefine(VolumetricFogShader::SHADER_GROUP_VULKAN_MEMORY_MODEL_NO_ATOMICS, "#define USE_VULKAN_MEMORY_MODEL\n#define NO_IMAGE_ATOMICS\n", false));
  183. volumetric_fog.shader.initialize(volumetric_fog_modes, defines);
  184. volumetric_fog.shader.enable_group(_get_fog_shader_group());
  185. material_storage->shader_set_data_request_function(RendererRD::MaterialStorage::SHADER_TYPE_FOG, _create_fog_shader_funcs);
  186. material_storage->material_set_data_request_function(RendererRD::MaterialStorage::SHADER_TYPE_FOG, _create_fog_material_funcs);
  187. volumetric_fog.volume_ubo = RD::get_singleton()->uniform_buffer_create(sizeof(VolumetricFogShader::VolumeUBO));
  188. }
  189. {
  190. ShaderCompiler::DefaultIdentifierActions actions;
  191. actions.renames["TIME"] = "scene_params.time";
  192. actions.renames["PI"] = String::num(Math::PI);
  193. actions.renames["TAU"] = String::num(Math::TAU);
  194. actions.renames["E"] = String::num(Math::E);
  195. actions.renames["WORLD_POSITION"] = "world.xyz";
  196. actions.renames["OBJECT_POSITION"] = "params.position";
  197. actions.renames["UVW"] = "uvw";
  198. actions.renames["SIZE"] = "params.size";
  199. actions.renames["ALBEDO"] = "albedo";
  200. actions.renames["DENSITY"] = "density";
  201. actions.renames["EMISSION"] = "emission";
  202. actions.renames["SDF"] = "sdf";
  203. actions.usage_defines["SDF"] = "#define SDF_USED\n";
  204. actions.usage_defines["DENSITY"] = "#define DENSITY_USED\n";
  205. actions.usage_defines["ALBEDO"] = "#define ALBEDO_USED\n";
  206. actions.usage_defines["EMISSION"] = "#define EMISSION_USED\n";
  207. actions.base_texture_binding_index = 1;
  208. actions.texture_layout_set = VolumetricFogShader::FogSet::FOG_SET_MATERIAL;
  209. actions.base_uniform_string = "material.";
  210. actions.default_filter = ShaderLanguage::FILTER_LINEAR_MIPMAP;
  211. actions.default_repeat = ShaderLanguage::REPEAT_DISABLE;
  212. actions.global_buffer_array_variable = "global_shader_uniforms.data";
  213. volumetric_fog.compiler.initialize(actions);
  214. }
  215. {
  216. // default material and shader for fog shader
  217. volumetric_fog.default_shader = material_storage->shader_allocate();
  218. material_storage->shader_initialize(volumetric_fog.default_shader);
  219. material_storage->shader_set_code(volumetric_fog.default_shader, R"(
  220. // Default fog shader.
  221. shader_type fog;
  222. void fog() {
  223. DENSITY = 1.0;
  224. ALBEDO = vec3(1.0);
  225. }
  226. )");
  227. volumetric_fog.default_material = material_storage->material_allocate();
  228. material_storage->material_initialize(volumetric_fog.default_material);
  229. material_storage->material_set_shader(volumetric_fog.default_material, volumetric_fog.default_shader);
  230. FogMaterialData *md = static_cast<FogMaterialData *>(material_storage->material_get_data(volumetric_fog.default_material, RendererRD::MaterialStorage::SHADER_TYPE_FOG));
  231. volumetric_fog.default_shader_rd = volumetric_fog.shader.version_get_shader(md->shader_data->version, _get_fog_variant());
  232. Vector<RD::Uniform> uniforms;
  233. {
  234. RD::Uniform u;
  235. u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
  236. u.binding = 2;
  237. u.append_id(RendererRD::MaterialStorage::get_singleton()->global_shader_uniforms_get_storage_buffer());
  238. uniforms.push_back(u);
  239. }
  240. material_storage->samplers_rd_get_default().append_uniforms(uniforms, SAMPLERS_BINDING_FIRST_INDEX);
  241. volumetric_fog.base_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.default_shader_rd, VolumetricFogShader::FogSet::FOG_SET_BASE);
  242. }
  243. {
  244. String defines = "\n#define MAX_DIRECTIONAL_LIGHT_DATA_STRUCTS " + itos(p_max_directional_lights) + "\n";
  245. defines += "\n#define MAX_SKY_LOD " + itos(p_roughness_layers - 1) + ".0\n";
  246. if (p_is_using_radiance_octmap_array) {
  247. defines += "\n#define USE_RADIANCE_OCTMAP_ARRAY \n";
  248. }
  249. Vector<ShaderRD::VariantDefine> volumetric_fog_modes;
  250. int shader_group = 0;
  251. for (int vk_memory_model = 0; vk_memory_model < 2; vk_memory_model++) {
  252. for (int no_atomics = 0; no_atomics < 2; no_atomics++) {
  253. String base_define = vk_memory_model ? "\n#define USE_VULKAN_MEMORY_MODEL" : "";
  254. base_define += no_atomics ? "\n#define NO_IMAGE_ATOMICS" : "";
  255. volumetric_fog_modes.push_back(ShaderRD::VariantDefine(shader_group, base_define + "\n#define MODE_DENSITY\n", false));
  256. volumetric_fog_modes.push_back(ShaderRD::VariantDefine(shader_group, base_define + "\n#define MODE_DENSITY\n#define ENABLE_SDFGI\n", false));
  257. volumetric_fog_modes.push_back(ShaderRD::VariantDefine(shader_group, base_define + "\n#define MODE_FILTER\n", false));
  258. volumetric_fog_modes.push_back(ShaderRD::VariantDefine(shader_group, base_define + "\n#define MODE_FOG\n", false));
  259. volumetric_fog_modes.push_back(ShaderRD::VariantDefine(shader_group, base_define + "\n#define MODE_COPY\n", false));
  260. shader_group++;
  261. }
  262. }
  263. volumetric_fog.process_shader.initialize(volumetric_fog_modes, defines);
  264. volumetric_fog.process_shader.enable_group(_get_fog_shader_group());
  265. volumetric_fog.process_shader_version = volumetric_fog.process_shader.version_create();
  266. for (int i = 0; i < VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_MAX; i++) {
  267. volumetric_fog.process_pipelines[i].create_compute_pipeline(volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, _get_fog_process_variant(i)));
  268. }
  269. volumetric_fog.params_ubo = RD::get_singleton()->uniform_buffer_create(sizeof(VolumetricFogShader::ParamsUBO));
  270. }
  271. }
  272. void Fog::free_fog_shader() {
  273. MaterialStorage *material_storage = MaterialStorage::get_singleton();
  274. for (int i = 0; i < VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_MAX; i++) {
  275. volumetric_fog.process_pipelines[i].free();
  276. }
  277. if (volumetric_fog.process_shader_version.is_valid()) {
  278. volumetric_fog.process_shader.version_free(volumetric_fog.process_shader_version);
  279. }
  280. if (volumetric_fog.volume_ubo.is_valid()) {
  281. RD::get_singleton()->free_rid(volumetric_fog.volume_ubo);
  282. }
  283. if (volumetric_fog.params_ubo.is_valid()) {
  284. RD::get_singleton()->free_rid(volumetric_fog.params_ubo);
  285. }
  286. if (volumetric_fog.default_shader.is_valid()) {
  287. material_storage->shader_free(volumetric_fog.default_shader);
  288. }
  289. if (volumetric_fog.default_material.is_valid()) {
  290. material_storage->material_free(volumetric_fog.default_material);
  291. }
  292. }
  293. void Fog::FogShaderData::set_code(const String &p_code) {
  294. //compile
  295. code = p_code;
  296. valid = false;
  297. ubo_size = 0;
  298. uniforms.clear();
  299. if (code.is_empty()) {
  300. return; //just invalid, but no error
  301. }
  302. ShaderCompiler::GeneratedCode gen_code;
  303. ShaderCompiler::IdentifierActions actions;
  304. actions.entry_point_stages["fog"] = ShaderCompiler::STAGE_COMPUTE;
  305. uses_time = false;
  306. actions.usage_flag_pointers["TIME"] = &uses_time;
  307. actions.uniforms = &uniforms;
  308. Fog *fog_singleton = Fog::get_singleton();
  309. Error err = fog_singleton->volumetric_fog.compiler.compile(RS::SHADER_FOG, code, &actions, path, gen_code);
  310. ERR_FAIL_COND_MSG(err != OK, "Fog shader compilation failed.");
  311. if (version.is_null()) {
  312. version = fog_singleton->volumetric_fog.shader.version_create();
  313. } else {
  314. pipeline.free();
  315. }
  316. fog_singleton->volumetric_fog.shader.version_set_compute_code(version, gen_code.code, gen_code.uniforms, gen_code.stage_globals[ShaderCompiler::STAGE_COMPUTE], gen_code.defines);
  317. ERR_FAIL_COND(!fog_singleton->volumetric_fog.shader.version_is_valid(version));
  318. ubo_size = gen_code.uniform_total_size;
  319. ubo_offsets = gen_code.uniform_offsets;
  320. texture_uniforms = gen_code.texture_uniforms;
  321. pipeline.create_compute_pipeline(fog_singleton->volumetric_fog.shader.version_get_shader(version, _get_fog_variant()));
  322. valid = true;
  323. }
  324. bool Fog::FogShaderData::is_animated() const {
  325. return false;
  326. }
  327. bool Fog::FogShaderData::casts_shadows() const {
  328. return false;
  329. }
  330. RS::ShaderNativeSourceCode Fog::FogShaderData::get_native_source_code() const {
  331. Fog *fog_singleton = Fog::get_singleton();
  332. return fog_singleton->volumetric_fog.shader.version_get_native_source_code(version);
  333. }
  334. Pair<ShaderRD *, RID> Fog::FogShaderData::get_native_shader_and_version() const {
  335. Fog *fog_singleton = Fog::get_singleton();
  336. return { &fog_singleton->volumetric_fog.shader, version };
  337. }
  338. Fog::FogShaderData::~FogShaderData() {
  339. pipeline.free();
  340. Fog *fog_singleton = Fog::get_singleton();
  341. ERR_FAIL_NULL(fog_singleton);
  342. if (version.is_valid()) {
  343. fog_singleton->volumetric_fog.shader.version_free(version);
  344. }
  345. }
  346. ////////////////////////////////////////////////////////////////////////////////
  347. // Volumetric Fog
  348. bool Fog::VolumetricFog::sync_gi_dependent_sets_validity(bool p_ensure_freed) {
  349. bool null = gi_dependent_sets.process_uniform_set_density.is_null();
  350. bool valid = !null && RD::get_singleton()->uniform_set_is_valid(gi_dependent_sets.process_uniform_set_density);
  351. #ifdef DEV_ENABLED
  352. // It's all-or-nothing, or something else has changed that requires dev attention.
  353. DEV_ASSERT(null == gi_dependent_sets.process_uniform_set.is_null());
  354. DEV_ASSERT(null == gi_dependent_sets.process_uniform_set2.is_null());
  355. DEV_ASSERT(valid == RD::get_singleton()->uniform_set_is_valid(gi_dependent_sets.process_uniform_set));
  356. DEV_ASSERT(valid == RD::get_singleton()->uniform_set_is_valid(gi_dependent_sets.process_uniform_set2));
  357. #endif
  358. if (valid) {
  359. if (p_ensure_freed) {
  360. RD::get_singleton()->free_rid(gi_dependent_sets.process_uniform_set_density);
  361. RD::get_singleton()->free_rid(gi_dependent_sets.process_uniform_set);
  362. RD::get_singleton()->free_rid(gi_dependent_sets.process_uniform_set2);
  363. valid = false;
  364. }
  365. }
  366. if (!valid && !null) {
  367. gi_dependent_sets = {};
  368. }
  369. return valid;
  370. }
  371. void Fog::VolumetricFog::init(const Vector3i &fog_size, RID p_sky_shader) {
  372. width = fog_size.x;
  373. height = fog_size.y;
  374. depth = fog_size.z;
  375. atomic_type = RD::get_singleton()->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT) ? RD::UNIFORM_TYPE_IMAGE : RD::UNIFORM_TYPE_STORAGE_BUFFER;
  376. RD::TextureFormat tf;
  377. tf.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
  378. tf.width = fog_size.x;
  379. tf.height = fog_size.y;
  380. tf.depth = fog_size.z;
  381. tf.texture_type = RD::TEXTURE_TYPE_3D;
  382. tf.usage_bits = RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_CAN_COPY_FROM_BIT;
  383. light_density_map = RD::get_singleton()->texture_create(tf, RD::TextureView());
  384. RD::get_singleton()->set_resource_name(light_density_map, "Fog light-density map");
  385. tf.usage_bits = RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT;
  386. prev_light_density_map = RD::get_singleton()->texture_create(tf, RD::TextureView());
  387. RD::get_singleton()->set_resource_name(prev_light_density_map, "Fog previous light-density map");
  388. RD::get_singleton()->texture_clear(prev_light_density_map, Color(0, 0, 0, 0), 0, 1, 0, 1);
  389. tf.usage_bits = RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT;
  390. fog_map = RD::get_singleton()->texture_create(tf, RD::TextureView());
  391. RD::get_singleton()->set_resource_name(fog_map, "Fog map");
  392. if (atomic_type == RD::UNIFORM_TYPE_STORAGE_BUFFER) {
  393. Vector<uint8_t> dm;
  394. dm.resize_initialized(fog_size.x * fog_size.y * fog_size.z * 4);
  395. density_map = RD::get_singleton()->storage_buffer_create(dm.size(), dm);
  396. RD::get_singleton()->set_resource_name(density_map, "Fog density map");
  397. light_map = RD::get_singleton()->storage_buffer_create(dm.size(), dm);
  398. RD::get_singleton()->set_resource_name(light_map, "Fog light map");
  399. emissive_map = RD::get_singleton()->storage_buffer_create(dm.size(), dm);
  400. RD::get_singleton()->set_resource_name(emissive_map, "Fog emissive map");
  401. } else {
  402. tf.format = RD::DATA_FORMAT_R32_UINT;
  403. tf.usage_bits = RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT | RD::TEXTURE_USAGE_STORAGE_ATOMIC_BIT;
  404. density_map = RD::get_singleton()->texture_create(tf, RD::TextureView());
  405. RD::get_singleton()->set_resource_name(density_map, "Fog density map");
  406. RD::get_singleton()->texture_clear(density_map, Color(0, 0, 0, 0), 0, 1, 0, 1);
  407. light_map = RD::get_singleton()->texture_create(tf, RD::TextureView());
  408. RD::get_singleton()->set_resource_name(light_map, "Fog light map");
  409. RD::get_singleton()->texture_clear(light_map, Color(0, 0, 0, 0), 0, 1, 0, 1);
  410. emissive_map = RD::get_singleton()->texture_create(tf, RD::TextureView());
  411. RD::get_singleton()->set_resource_name(emissive_map, "Fog emissive map");
  412. RD::get_singleton()->texture_clear(emissive_map, Color(0, 0, 0, 0), 0, 1, 0, 1);
  413. }
  414. Vector<RD::Uniform> uniforms;
  415. {
  416. RD::Uniform u;
  417. u.binding = 0;
  418. u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
  419. u.append_id(fog_map);
  420. uniforms.push_back(u);
  421. }
  422. sky_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, p_sky_shader, RendererRD::SkyRD::SKY_SET_FOG);
  423. }
  424. Fog::VolumetricFog::~VolumetricFog() {
  425. RD::get_singleton()->free_rid(prev_light_density_map);
  426. RD::get_singleton()->free_rid(light_density_map);
  427. RD::get_singleton()->free_rid(fog_map);
  428. RD::get_singleton()->free_rid(density_map);
  429. RD::get_singleton()->free_rid(light_map);
  430. RD::get_singleton()->free_rid(emissive_map);
  431. if (fog_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(fog_uniform_set)) {
  432. RD::get_singleton()->free_rid(fog_uniform_set);
  433. }
  434. if (copy_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(copy_uniform_set)) {
  435. RD::get_singleton()->free_rid(copy_uniform_set);
  436. }
  437. sync_gi_dependent_sets_validity(true);
  438. if (sdfgi_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(sdfgi_uniform_set)) {
  439. RD::get_singleton()->free_rid(sdfgi_uniform_set);
  440. }
  441. if (sky_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(sky_uniform_set)) {
  442. RD::get_singleton()->free_rid(sky_uniform_set);
  443. }
  444. }
  445. Vector3i Fog::_point_get_position_in_froxel_volume(const Vector3 &p_point, float fog_end, const Vector2 &fog_near_size, const Vector2 &fog_far_size, float volumetric_fog_detail_spread, const Vector3 &fog_size, const Transform3D &p_cam_transform) {
  446. Vector3 view_position = p_cam_transform.affine_inverse().xform(p_point);
  447. view_position.z = MIN(view_position.z, -0.01); // Clamp to the front of camera
  448. Vector3 fog_position = Vector3(0, 0, 0);
  449. view_position.y = -view_position.y;
  450. fog_position.z = -view_position.z / fog_end;
  451. fog_position.x = (view_position.x / (2 * (fog_near_size.x * (1.0 - fog_position.z) + fog_far_size.x * fog_position.z))) + 0.5;
  452. fog_position.y = (view_position.y / (2 * (fog_near_size.y * (1.0 - fog_position.z) + fog_far_size.y * fog_position.z))) + 0.5;
  453. fog_position.z = Math::pow(float(fog_position.z), float(1.0 / volumetric_fog_detail_spread));
  454. fog_position = fog_position * fog_size - Vector3(0.5, 0.5, 0.5);
  455. fog_position = fog_position.clamp(Vector3(), fog_size);
  456. return Vector3i(fog_position);
  457. }
  458. void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const Projection &p_cam_projection, const Transform3D &p_cam_transform, const Transform3D &p_prev_cam_inv_transform, RID p_shadow_atlas, int p_directional_light_count, bool p_use_directional_shadows, int p_positional_light_count, int p_voxel_gi_count, const PagedArray<RID> &p_fog_volumes) {
  459. RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
  460. RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
  461. RENDER_TIMESTAMP("> Volumetric Fog");
  462. RD::get_singleton()->draw_command_begin_label("Volumetric Fog");
  463. Ref<VolumetricFog> fog = p_settings.vfog;
  464. if (p_fog_volumes.size() > 0) {
  465. RD::get_singleton()->draw_command_begin_label("Render Volumetric Fog Volumes");
  466. RENDER_TIMESTAMP("Render FogVolumes");
  467. VolumetricFogShader::VolumeUBO params;
  468. Vector2 frustum_near_size = p_cam_projection.get_viewport_half_extents();
  469. Vector2 frustum_far_size = p_cam_projection.get_far_plane_half_extents();
  470. float z_near = p_cam_projection.get_z_near();
  471. float z_far = p_cam_projection.get_z_far();
  472. float fog_end = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_length(p_settings.env);
  473. Vector2 fog_far_size = frustum_near_size.lerp(frustum_far_size, (fog_end - z_near) / (z_far - z_near));
  474. Vector2 fog_near_size;
  475. if (p_cam_projection.is_orthogonal()) {
  476. fog_near_size = fog_far_size;
  477. } else {
  478. fog_near_size = frustum_near_size.maxf(0.001);
  479. }
  480. params.fog_frustum_size_begin[0] = fog_near_size.x;
  481. params.fog_frustum_size_begin[1] = fog_near_size.y;
  482. params.fog_frustum_size_end[0] = fog_far_size.x;
  483. params.fog_frustum_size_end[1] = fog_far_size.y;
  484. params.fog_frustum_end = fog_end;
  485. params.z_near = z_near;
  486. params.z_far = z_far;
  487. params.time = p_settings.time;
  488. params.fog_volume_size[0] = fog->width;
  489. params.fog_volume_size[1] = fog->height;
  490. params.fog_volume_size[2] = fog->depth;
  491. params.use_temporal_reprojection = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_temporal_reprojection(p_settings.env);
  492. params.temporal_frame = RSG::rasterizer->get_frame_number() % VolumetricFog::MAX_TEMPORAL_FRAMES;
  493. params.detail_spread = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_detail_spread(p_settings.env);
  494. params.temporal_blend = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_temporal_reprojection_amount(p_settings.env);
  495. Transform3D to_prev_cam_view = p_prev_cam_inv_transform * p_cam_transform;
  496. RendererRD::MaterialStorage::store_transform(to_prev_cam_view, params.to_prev_view);
  497. RendererRD::MaterialStorage::store_transform(p_cam_transform, params.transform);
  498. RD::get_singleton()->buffer_update(volumetric_fog.volume_ubo, 0, sizeof(VolumetricFogShader::VolumeUBO), &params);
  499. if (fog->fog_uniform_set.is_null() || !RD::get_singleton()->uniform_set_is_valid(fog->fog_uniform_set)) {
  500. Vector<RD::Uniform> uniforms;
  501. {
  502. RD::Uniform u;
  503. u.uniform_type = fog->atomic_type;
  504. u.binding = 1;
  505. u.append_id(fog->emissive_map);
  506. uniforms.push_back(u);
  507. }
  508. {
  509. RD::Uniform u;
  510. u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  511. u.binding = 2;
  512. u.append_id(volumetric_fog.volume_ubo);
  513. uniforms.push_back(u);
  514. }
  515. {
  516. RD::Uniform u;
  517. u.uniform_type = fog->atomic_type;
  518. u.binding = 3;
  519. u.append_id(fog->density_map);
  520. uniforms.push_back(u);
  521. }
  522. {
  523. RD::Uniform u;
  524. u.uniform_type = fog->atomic_type;
  525. u.binding = 4;
  526. u.append_id(fog->light_map);
  527. uniforms.push_back(u);
  528. }
  529. fog->fog_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.default_shader_rd, VolumetricFogShader::FogSet::FOG_SET_UNIFORMS);
  530. }
  531. RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin();
  532. bool any_uses_time = false;
  533. Vector3 cam_position = p_cam_transform.get_origin();
  534. for (int i = 0; i < (int)p_fog_volumes.size(); i++) {
  535. FogVolumeInstance *fog_volume_instance = fog_volume_instance_owner.get_or_null(p_fog_volumes[i]);
  536. ERR_FAIL_NULL(fog_volume_instance);
  537. RID fog_volume = fog_volume_instance->volume;
  538. RID fog_material = RendererRD::Fog::get_singleton()->fog_volume_get_material(fog_volume);
  539. FogMaterialData *material = nullptr;
  540. if (fog_material.is_valid()) {
  541. material = static_cast<FogMaterialData *>(material_storage->material_get_data(fog_material, RendererRD::MaterialStorage::SHADER_TYPE_FOG));
  542. if (!material || !material->shader_data->valid) {
  543. material = nullptr;
  544. }
  545. }
  546. if (!material) {
  547. fog_material = volumetric_fog.default_material;
  548. material = static_cast<FogMaterialData *>(material_storage->material_get_data(fog_material, RendererRD::MaterialStorage::SHADER_TYPE_FOG));
  549. }
  550. ERR_FAIL_NULL(material);
  551. FogShaderData *shader_data = material->shader_data;
  552. ERR_FAIL_NULL(shader_data);
  553. any_uses_time |= shader_data->uses_time;
  554. Vector3i froxel_min;
  555. Vector3i froxel_max;
  556. Vector3i kernel_size;
  557. Vector3 fog_position = fog_volume_instance->transform.get_origin();
  558. RS::FogVolumeShape volume_type = RendererRD::Fog::get_singleton()->fog_volume_get_shape(fog_volume);
  559. Vector3 extents = RendererRD::Fog::get_singleton()->fog_volume_get_size(fog_volume) / 2;
  560. if (volume_type != RS::FOG_VOLUME_SHAPE_WORLD) {
  561. // Local fog volume.
  562. Vector3 fog_size = Vector3(fog->width, fog->height, fog->depth);
  563. float volumetric_fog_detail_spread = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_detail_spread(p_settings.env);
  564. Vector3 corners[8]{
  565. fog_volume_instance->transform.xform(Vector3(extents.x, extents.y, extents.z)),
  566. fog_volume_instance->transform.xform(Vector3(-extents.x, extents.y, extents.z)),
  567. fog_volume_instance->transform.xform(Vector3(extents.x, -extents.y, extents.z)),
  568. fog_volume_instance->transform.xform(Vector3(-extents.x, -extents.y, extents.z)),
  569. fog_volume_instance->transform.xform(Vector3(extents.x, extents.y, -extents.z)),
  570. fog_volume_instance->transform.xform(Vector3(-extents.x, extents.y, -extents.z)),
  571. fog_volume_instance->transform.xform(Vector3(extents.x, -extents.y, -extents.z)),
  572. fog_volume_instance->transform.xform(Vector3(-extents.x, -extents.y, -extents.z))
  573. };
  574. Vector3i froxels[8];
  575. Vector3 corner_min = corners[0];
  576. Vector3 corner_max = corners[0];
  577. for (int j = 0; j < 8; j++) {
  578. froxels[j] = _point_get_position_in_froxel_volume(corners[j], fog_end, fog_near_size, fog_far_size, volumetric_fog_detail_spread, fog_size, p_cam_transform);
  579. corner_min = corner_min.min(corners[j]);
  580. corner_max = corner_max.max(corners[j]);
  581. }
  582. froxel_min = Vector3i(int32_t(fog->width) - 1, int32_t(fog->height) - 1, int32_t(fog->depth) - 1);
  583. froxel_max = Vector3i(1, 1, 1);
  584. // Tracking just the corners of the fog volume can result in missing some fog:
  585. // when the camera's near plane is inside the fog, we must always consider the entire screen
  586. Vector3 near_plane_corner(frustum_near_size.x, frustum_near_size.y, z_near);
  587. float expand = near_plane_corner.length();
  588. if (cam_position.x > (corner_min.x - expand) && cam_position.x < (corner_max.x + expand) &&
  589. cam_position.y > (corner_min.y - expand) && cam_position.y < (corner_max.y + expand) &&
  590. cam_position.z > (corner_min.z - expand) && cam_position.z < (corner_max.z + expand)) {
  591. froxel_min.x = 0;
  592. froxel_min.y = 0;
  593. froxel_min.z = 0;
  594. froxel_max.x = int32_t(fog->width);
  595. froxel_max.y = int32_t(fog->height);
  596. for (int j = 0; j < 8; j++) {
  597. froxel_max.z = MAX(froxel_max.z, froxels[j].z);
  598. }
  599. } else {
  600. // Camera is guaranteed to be outside the fog volume
  601. for (int j = 0; j < 8; j++) {
  602. froxel_min = froxel_min.min(froxels[j]);
  603. froxel_max = froxel_max.max(froxels[j]);
  604. }
  605. }
  606. kernel_size = froxel_max - froxel_min;
  607. } else {
  608. // Volume type global runs on all cells
  609. extents = Vector3(fog->width, fog->height, fog->depth);
  610. froxel_min = Vector3i(0, 0, 0);
  611. kernel_size = Vector3i(int32_t(fog->width), int32_t(fog->height), int32_t(fog->depth));
  612. }
  613. if (kernel_size.x == 0 || kernel_size.y == 0 || kernel_size.z == 0) {
  614. continue;
  615. }
  616. VolumetricFogShader::FogPushConstant push_constant;
  617. push_constant.position[0] = fog_position.x;
  618. push_constant.position[1] = fog_position.y;
  619. push_constant.position[2] = fog_position.z;
  620. push_constant.size[0] = extents.x * 2;
  621. push_constant.size[1] = extents.y * 2;
  622. push_constant.size[2] = extents.z * 2;
  623. push_constant.corner[0] = froxel_min.x;
  624. push_constant.corner[1] = froxel_min.y;
  625. push_constant.corner[2] = froxel_min.z;
  626. push_constant.shape = uint32_t(RendererRD::Fog::get_singleton()->fog_volume_get_shape(fog_volume));
  627. RendererRD::MaterialStorage::store_transform(fog_volume_instance->transform.affine_inverse(), push_constant.transform);
  628. RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, shader_data->pipeline.get_rid());
  629. RD::get_singleton()->compute_list_bind_uniform_set(compute_list, fog->fog_uniform_set, VolumetricFogShader::FogSet::FOG_SET_UNIFORMS);
  630. RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(VolumetricFogShader::FogPushConstant));
  631. RD::get_singleton()->compute_list_bind_uniform_set(compute_list, volumetric_fog.base_uniform_set, VolumetricFogShader::FogSet::FOG_SET_BASE);
  632. if (material->uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(material->uniform_set)) { // Material may not have a uniform set.
  633. RD::get_singleton()->compute_list_bind_uniform_set(compute_list, material->uniform_set, VolumetricFogShader::FogSet::FOG_SET_MATERIAL);
  634. material->set_as_used();
  635. }
  636. RD::get_singleton()->compute_list_dispatch_threads(compute_list, kernel_size.x, kernel_size.y, kernel_size.z);
  637. }
  638. if (any_uses_time || RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_temporal_reprojection(p_settings.env)) {
  639. RenderingServerDefault::redraw_request();
  640. }
  641. RD::get_singleton()->draw_command_end_label();
  642. RD::get_singleton()->compute_list_end();
  643. }
  644. bool gi_dependent_sets_valid = fog->sync_gi_dependent_sets_validity();
  645. if (!fog->copy_uniform_set.is_null() && !RD::get_singleton()->uniform_set_is_valid(fog->copy_uniform_set)) {
  646. fog->copy_uniform_set = RID();
  647. }
  648. if (!gi_dependent_sets_valid || fog->copy_uniform_set.is_null()) {
  649. //re create uniform set if needed
  650. Vector<RD::Uniform> uniforms;
  651. Vector<RD::Uniform> copy_uniforms;
  652. {
  653. RD::Uniform u;
  654. u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
  655. u.binding = 1;
  656. if (p_settings.shadow_atlas_depth.is_null()) {
  657. u.append_id(texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK));
  658. } else {
  659. u.append_id(p_settings.shadow_atlas_depth);
  660. }
  661. uniforms.push_back(u);
  662. copy_uniforms.push_back(u);
  663. }
  664. {
  665. RD::Uniform u;
  666. u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
  667. u.binding = 2;
  668. if (p_settings.directional_shadow_depth.is_valid()) {
  669. u.append_id(p_settings.directional_shadow_depth);
  670. } else {
  671. u.append_id(texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK));
  672. }
  673. uniforms.push_back(u);
  674. copy_uniforms.push_back(u);
  675. }
  676. {
  677. RD::Uniform u;
  678. u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
  679. u.binding = 3;
  680. u.append_id(p_settings.omni_light_buffer);
  681. uniforms.push_back(u);
  682. copy_uniforms.push_back(u);
  683. }
  684. {
  685. RD::Uniform u;
  686. u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
  687. u.binding = 4;
  688. u.append_id(p_settings.spot_light_buffer);
  689. uniforms.push_back(u);
  690. copy_uniforms.push_back(u);
  691. }
  692. {
  693. RD::Uniform u;
  694. u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  695. u.binding = 5;
  696. u.append_id(p_settings.directional_light_buffer);
  697. uniforms.push_back(u);
  698. copy_uniforms.push_back(u);
  699. }
  700. {
  701. RD::Uniform u;
  702. u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
  703. u.binding = 6;
  704. u.append_id(p_settings.cluster_builder->get_cluster_buffer());
  705. uniforms.push_back(u);
  706. copy_uniforms.push_back(u);
  707. }
  708. {
  709. RD::Uniform u;
  710. u.uniform_type = RD::UNIFORM_TYPE_SAMPLER;
  711. u.binding = 7;
  712. u.append_id(material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED));
  713. uniforms.push_back(u);
  714. copy_uniforms.push_back(u);
  715. }
  716. {
  717. RD::Uniform u;
  718. u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
  719. u.binding = 8;
  720. u.append_id(fog->light_density_map);
  721. uniforms.push_back(u);
  722. copy_uniforms.push_back(u);
  723. }
  724. {
  725. RD::Uniform u;
  726. u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
  727. u.binding = 9;
  728. u.append_id(fog->fog_map);
  729. uniforms.push_back(u);
  730. }
  731. {
  732. RD::Uniform u;
  733. u.uniform_type = RD::UNIFORM_TYPE_IMAGE;
  734. u.binding = 9;
  735. u.append_id(fog->prev_light_density_map);
  736. copy_uniforms.push_back(u);
  737. }
  738. {
  739. RD::Uniform u;
  740. u.uniform_type = RD::UNIFORM_TYPE_SAMPLER;
  741. u.binding = 10;
  742. u.append_id(p_settings.shadow_sampler);
  743. uniforms.push_back(u);
  744. copy_uniforms.push_back(u);
  745. }
  746. {
  747. RD::Uniform u;
  748. u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  749. u.binding = 11;
  750. u.append_id(p_settings.voxel_gi_buffer);
  751. uniforms.push_back(u);
  752. copy_uniforms.push_back(u);
  753. }
  754. {
  755. RD::Uniform u;
  756. u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
  757. u.binding = 12;
  758. for (int i = 0; i < RendererRD::GI::MAX_VOXEL_GI_INSTANCES; i++) {
  759. u.append_id(p_settings.rbgi->voxel_gi_textures[i]);
  760. }
  761. uniforms.push_back(u);
  762. copy_uniforms.push_back(u);
  763. }
  764. {
  765. RD::Uniform u;
  766. u.uniform_type = RD::UNIFORM_TYPE_SAMPLER;
  767. u.binding = 13;
  768. u.append_id(material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED));
  769. uniforms.push_back(u);
  770. copy_uniforms.push_back(u);
  771. }
  772. {
  773. RD::Uniform u;
  774. u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  775. u.binding = 14;
  776. u.append_id(volumetric_fog.params_ubo);
  777. uniforms.push_back(u);
  778. copy_uniforms.push_back(u);
  779. }
  780. {
  781. RD::Uniform u;
  782. u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
  783. u.binding = 15;
  784. u.append_id(fog->prev_light_density_map);
  785. uniforms.push_back(u);
  786. }
  787. {
  788. RD::Uniform u;
  789. u.uniform_type = fog->atomic_type;
  790. u.binding = 16;
  791. u.append_id(fog->density_map);
  792. uniforms.push_back(u);
  793. }
  794. {
  795. RD::Uniform u;
  796. u.uniform_type = fog->atomic_type;
  797. u.binding = 17;
  798. u.append_id(fog->light_map);
  799. uniforms.push_back(u);
  800. }
  801. {
  802. RD::Uniform u;
  803. u.uniform_type = fog->atomic_type;
  804. u.binding = 18;
  805. u.append_id(fog->emissive_map);
  806. uniforms.push_back(u);
  807. }
  808. {
  809. RD::Uniform u;
  810. u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
  811. u.binding = 19;
  812. RID radiance_texture = texture_storage->texture_rd_get_default(p_settings.is_using_radiance_octmap_array ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
  813. RID sky_texture = RendererSceneRenderRD::get_singleton()->environment_get_sky(p_settings.env).is_valid() ? p_settings.sky->sky_get_radiance_texture_rd(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_settings.env)) : RID();
  814. u.append_id(sky_texture.is_valid() ? sky_texture : radiance_texture);
  815. uniforms.push_back(u);
  816. }
  817. if (fog->copy_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(fog->copy_uniform_set)) {
  818. RD::get_singleton()->free_rid(fog->copy_uniform_set);
  819. }
  820. fog->copy_uniform_set = RD::get_singleton()->uniform_set_create(copy_uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, _get_fog_process_variant(VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_COPY)), 0);
  821. if (!gi_dependent_sets_valid) {
  822. fog->gi_dependent_sets.process_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, _get_fog_process_variant(VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_FOG)), 0);
  823. RID aux7 = uniforms.write[7].get_id(0);
  824. RID aux8 = uniforms.write[8].get_id(0);
  825. uniforms.write[7].set_id(0, aux8);
  826. uniforms.write[8].set_id(0, aux7);
  827. fog->gi_dependent_sets.process_uniform_set2 = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, _get_fog_process_variant(VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_FOG)), 0);
  828. uniforms.remove_at(8);
  829. uniforms.write[7].set_id(0, aux7);
  830. fog->gi_dependent_sets.process_uniform_set_density = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, _get_fog_process_variant(VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY)), 0);
  831. }
  832. }
  833. bool using_sdfgi = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_gi_inject(p_settings.env) > 0.0001 && RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_enabled(p_settings.env) && (p_settings.sdfgi.is_valid());
  834. if (using_sdfgi) {
  835. if (fog->sdfgi_uniform_set.is_null() || !RD::get_singleton()->uniform_set_is_valid(fog->sdfgi_uniform_set)) {
  836. Vector<RD::Uniform> uniforms;
  837. {
  838. RD::Uniform u;
  839. u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  840. u.binding = 0;
  841. u.append_id(p_settings.gi->sdfgi_ubo);
  842. uniforms.push_back(u);
  843. }
  844. {
  845. RD::Uniform u;
  846. u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
  847. u.binding = 1;
  848. u.append_id(p_settings.sdfgi->ambient_texture);
  849. uniforms.push_back(u);
  850. }
  851. {
  852. RD::Uniform u;
  853. u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
  854. u.binding = 2;
  855. u.append_id(p_settings.sdfgi->occlusion_texture);
  856. uniforms.push_back(u);
  857. }
  858. fog->sdfgi_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, _get_fog_process_variant(VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY_WITH_SDFGI)), 1);
  859. }
  860. }
  861. fog->length = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_length(p_settings.env);
  862. fog->spread = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_detail_spread(p_settings.env);
  863. VolumetricFogShader::ParamsUBO params;
  864. Vector2 frustum_near_size = p_cam_projection.get_viewport_half_extents();
  865. Vector2 frustum_far_size = p_cam_projection.get_far_plane_half_extents();
  866. float z_near = p_cam_projection.get_z_near();
  867. float z_far = p_cam_projection.get_z_far();
  868. float fog_end = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_length(p_settings.env);
  869. Vector2 fog_far_size = frustum_near_size.lerp(frustum_far_size, (fog_end - z_near) / (z_far - z_near));
  870. Vector2 fog_near_size;
  871. if (p_cam_projection.is_orthogonal()) {
  872. fog_near_size = fog_far_size;
  873. } else {
  874. fog_near_size = frustum_near_size.maxf(0.001);
  875. }
  876. params.fog_frustum_size_begin[0] = fog_near_size.x;
  877. params.fog_frustum_size_begin[1] = fog_near_size.y;
  878. params.fog_frustum_size_end[0] = fog_far_size.x;
  879. params.fog_frustum_size_end[1] = fog_far_size.y;
  880. params.ambient_inject = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_ambient_inject(p_settings.env) * RendererSceneRenderRD::get_singleton()->environment_get_ambient_light_energy(p_settings.env);
  881. params.z_far = z_far;
  882. params.fog_frustum_end = fog_end;
  883. Color ambient_color = RendererSceneRenderRD::get_singleton()->environment_get_ambient_light(p_settings.env).srgb_to_linear();
  884. params.ambient_color[0] = ambient_color.r;
  885. params.ambient_color[1] = ambient_color.g;
  886. params.ambient_color[2] = ambient_color.b;
  887. params.sky_contribution = RendererSceneRenderRD::get_singleton()->environment_get_ambient_sky_contribution(p_settings.env);
  888. params.fog_volume_size[0] = fog->width;
  889. params.fog_volume_size[1] = fog->height;
  890. params.fog_volume_size[2] = fog->depth;
  891. params.directional_light_count = p_directional_light_count;
  892. Color emission = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_emission(p_settings.env).srgb_to_linear();
  893. params.base_emission[0] = emission.r * RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_emission_energy(p_settings.env);
  894. params.base_emission[1] = emission.g * RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_emission_energy(p_settings.env);
  895. params.base_emission[2] = emission.b * RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_emission_energy(p_settings.env);
  896. params.base_density = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_density(p_settings.env);
  897. Color base_scattering = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_scattering(p_settings.env).srgb_to_linear();
  898. params.base_scattering[0] = base_scattering.r;
  899. params.base_scattering[1] = base_scattering.g;
  900. params.base_scattering[2] = base_scattering.b;
  901. params.phase_g = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_anisotropy(p_settings.env);
  902. params.detail_spread = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_detail_spread(p_settings.env);
  903. params.gi_inject = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_gi_inject(p_settings.env);
  904. params.cam_rotation[0] = p_cam_transform.basis[0][0];
  905. params.cam_rotation[1] = p_cam_transform.basis[1][0];
  906. params.cam_rotation[2] = p_cam_transform.basis[2][0];
  907. params.cam_rotation[3] = 0;
  908. params.cam_rotation[4] = p_cam_transform.basis[0][1];
  909. params.cam_rotation[5] = p_cam_transform.basis[1][1];
  910. params.cam_rotation[6] = p_cam_transform.basis[2][1];
  911. params.cam_rotation[7] = 0;
  912. params.cam_rotation[8] = p_cam_transform.basis[0][2];
  913. params.cam_rotation[9] = p_cam_transform.basis[1][2];
  914. params.cam_rotation[10] = p_cam_transform.basis[2][2];
  915. params.cam_rotation[11] = 0;
  916. params.filter_axis = 0;
  917. params.max_voxel_gi_instances = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_gi_inject(p_settings.env) > 0.001 ? p_voxel_gi_count : 0;
  918. params.temporal_frame = RSG::rasterizer->get_frame_number() % VolumetricFog::MAX_TEMPORAL_FRAMES;
  919. Transform3D to_prev_cam_view = p_prev_cam_inv_transform * p_cam_transform;
  920. RendererRD::MaterialStorage::store_transform(to_prev_cam_view, params.to_prev_view);
  921. params.use_temporal_reprojection = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_temporal_reprojection(p_settings.env);
  922. params.temporal_blend = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_temporal_reprojection_amount(p_settings.env);
  923. RID sky_rid = RendererSceneRenderRD::get_singleton()->environment_get_sky(p_settings.env);
  924. if (sky_rid.is_valid()) {
  925. float uv_border_size = p_settings.sky->sky_get_uv_border_size(sky_rid);
  926. params.sky_border_size[0] = uv_border_size;
  927. params.sky_border_size[1] = 1.0f - uv_border_size * 2.0f;
  928. }
  929. {
  930. uint32_t cluster_size = p_settings.cluster_builder->get_cluster_size();
  931. params.cluster_shift = get_shift_from_power_of_2(cluster_size);
  932. uint32_t cluster_screen_width = Math::division_round_up((uint32_t)p_settings.rb_size.x, cluster_size);
  933. uint32_t cluster_screen_height = Math::division_round_up((uint32_t)p_settings.rb_size.y, cluster_size);
  934. params.max_cluster_element_count_div_32 = p_settings.max_cluster_elements / 32;
  935. params.cluster_type_size = cluster_screen_width * cluster_screen_height * (params.max_cluster_element_count_div_32 + 32);
  936. params.cluster_width = cluster_screen_width;
  937. params.screen_size[0] = p_settings.rb_size.x;
  938. params.screen_size[1] = p_settings.rb_size.y;
  939. }
  940. Basis sky_transform = RendererSceneRenderRD::get_singleton()->environment_get_sky_orientation(p_settings.env);
  941. sky_transform = sky_transform.inverse() * p_cam_transform.basis;
  942. RendererRD::MaterialStorage::store_transform_3x3(sky_transform, params.radiance_inverse_xform);
  943. RD::get_singleton()->draw_command_begin_label("Render Volumetric Fog");
  944. RENDER_TIMESTAMP("Render Fog");
  945. RD::get_singleton()->buffer_update(volumetric_fog.params_ubo, 0, sizeof(VolumetricFogShader::ParamsUBO), &params);
  946. RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin();
  947. RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, volumetric_fog.process_pipelines[using_sdfgi ? VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY_WITH_SDFGI : VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY].get_rid());
  948. RD::get_singleton()->compute_list_bind_uniform_set(compute_list, fog->gi_dependent_sets.process_uniform_set_density, 0);
  949. if (using_sdfgi) {
  950. RD::get_singleton()->compute_list_bind_uniform_set(compute_list, fog->sdfgi_uniform_set, 1);
  951. }
  952. RD::get_singleton()->compute_list_dispatch_threads(compute_list, fog->width, fog->height, fog->depth);
  953. RD::get_singleton()->compute_list_add_barrier(compute_list);
  954. // Copy fog to history buffer
  955. if (RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_temporal_reprojection(p_settings.env)) {
  956. RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, volumetric_fog.process_pipelines[VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_COPY].get_rid());
  957. RD::get_singleton()->compute_list_bind_uniform_set(compute_list, fog->copy_uniform_set, 0);
  958. RD::get_singleton()->compute_list_dispatch_threads(compute_list, fog->width, fog->height, fog->depth);
  959. RD::get_singleton()->compute_list_add_barrier(compute_list);
  960. }
  961. RD::get_singleton()->draw_command_end_label();
  962. if (p_settings.volumetric_fog_filter_active) {
  963. RD::get_singleton()->draw_command_begin_label("Filter Fog");
  964. RENDER_TIMESTAMP("Filter Fog");
  965. RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, volumetric_fog.process_pipelines[VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_FILTER].get_rid());
  966. RD::get_singleton()->compute_list_bind_uniform_set(compute_list, fog->gi_dependent_sets.process_uniform_set, 0);
  967. RD::get_singleton()->compute_list_dispatch_threads(compute_list, fog->width, fog->height, fog->depth);
  968. RD::get_singleton()->compute_list_end();
  969. //need restart for buffer update
  970. params.filter_axis = 1;
  971. RD::get_singleton()->buffer_update(volumetric_fog.params_ubo, 0, sizeof(VolumetricFogShader::ParamsUBO), &params);
  972. compute_list = RD::get_singleton()->compute_list_begin();
  973. RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, volumetric_fog.process_pipelines[VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_FILTER].get_rid());
  974. RD::get_singleton()->compute_list_bind_uniform_set(compute_list, fog->gi_dependent_sets.process_uniform_set2, 0);
  975. RD::get_singleton()->compute_list_dispatch_threads(compute_list, fog->width, fog->height, fog->depth);
  976. RD::get_singleton()->compute_list_add_barrier(compute_list);
  977. RD::get_singleton()->draw_command_end_label();
  978. }
  979. RENDER_TIMESTAMP("Integrate Fog");
  980. RD::get_singleton()->draw_command_begin_label("Integrate Fog");
  981. RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, volumetric_fog.process_pipelines[VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_FOG].get_rid());
  982. RD::get_singleton()->compute_list_bind_uniform_set(compute_list, fog->gi_dependent_sets.process_uniform_set, 0);
  983. RD::get_singleton()->compute_list_dispatch_threads(compute_list, fog->width, fog->height, 1);
  984. RD::get_singleton()->compute_list_end();
  985. RENDER_TIMESTAMP("< Volumetric Fog");
  986. RD::get_singleton()->draw_command_end_label();
  987. RD::get_singleton()->draw_command_end_label();
  988. }