rasterizer_scene_forward_rd.cpp 96 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510
  1. /*************************************************************************/
  2. /* rasterizer_scene_forward_rd.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
  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 "rasterizer_scene_forward_rd.h"
  31. #include "core/project_settings.h"
  32. #include "servers/visual/rendering_device.h"
  33. #include "servers/visual/visual_server_raster.h"
  34. static _FORCE_INLINE_ void store_transform(const Transform &p_mtx, float *p_array) {
  35. p_array[0] = p_mtx.basis.elements[0][0];
  36. p_array[1] = p_mtx.basis.elements[1][0];
  37. p_array[2] = p_mtx.basis.elements[2][0];
  38. p_array[3] = 0;
  39. p_array[4] = p_mtx.basis.elements[0][1];
  40. p_array[5] = p_mtx.basis.elements[1][1];
  41. p_array[6] = p_mtx.basis.elements[2][1];
  42. p_array[7] = 0;
  43. p_array[8] = p_mtx.basis.elements[0][2];
  44. p_array[9] = p_mtx.basis.elements[1][2];
  45. p_array[10] = p_mtx.basis.elements[2][2];
  46. p_array[11] = 0;
  47. p_array[12] = p_mtx.origin.x;
  48. p_array[13] = p_mtx.origin.y;
  49. p_array[14] = p_mtx.origin.z;
  50. p_array[15] = 1;
  51. }
  52. static _FORCE_INLINE_ void store_transform_3x3(const Transform &p_mtx, float *p_array) {
  53. p_array[0] = p_mtx.basis.elements[0][0];
  54. p_array[1] = p_mtx.basis.elements[1][0];
  55. p_array[2] = p_mtx.basis.elements[2][0];
  56. p_array[3] = 0;
  57. p_array[4] = p_mtx.basis.elements[0][1];
  58. p_array[5] = p_mtx.basis.elements[1][1];
  59. p_array[6] = p_mtx.basis.elements[2][1];
  60. p_array[7] = 0;
  61. p_array[8] = p_mtx.basis.elements[0][2];
  62. p_array[9] = p_mtx.basis.elements[1][2];
  63. p_array[10] = p_mtx.basis.elements[2][2];
  64. p_array[11] = 0;
  65. }
  66. static _FORCE_INLINE_ void store_transform_3x3_430(const Transform &p_mtx, float *p_array) {
  67. p_array[0] = p_mtx.basis.elements[0][0];
  68. p_array[1] = p_mtx.basis.elements[1][0];
  69. p_array[2] = p_mtx.basis.elements[2][0];
  70. p_array[3] = p_mtx.basis.elements[0][1];
  71. p_array[4] = p_mtx.basis.elements[1][1];
  72. p_array[5] = p_mtx.basis.elements[2][1];
  73. p_array[6] = p_mtx.basis.elements[0][2];
  74. p_array[7] = p_mtx.basis.elements[1][2];
  75. p_array[8] = p_mtx.basis.elements[2][2];
  76. }
  77. static _FORCE_INLINE_ void store_camera(const CameraMatrix &p_mtx, float *p_array) {
  78. for (int i = 0; i < 4; i++) {
  79. for (int j = 0; j < 4; j++) {
  80. p_array[i * 4 + j] = p_mtx.matrix[i][j];
  81. }
  82. }
  83. }
  84. void RasterizerSceneForwardRD::ShaderData::set_code(const String &p_code) {
  85. //compile
  86. code = p_code;
  87. valid = false;
  88. ubo_size = 0;
  89. uniforms.clear();
  90. uses_screen_texture = false;
  91. if (code == String()) {
  92. return; //just invalid, but no error
  93. }
  94. ShaderCompilerRD::GeneratedCode gen_code;
  95. int blend_mode = BLEND_MODE_MIX;
  96. int depth_testi = DEPTH_TEST_ENABLED;
  97. int cull = CULL_BACK;
  98. uses_point_size = false;
  99. uses_alpha = false;
  100. uses_blend_alpha = false;
  101. uses_depth_pre_pass = false;
  102. uses_discard = false;
  103. uses_roughness = false;
  104. uses_normal = false;
  105. bool wireframe = false;
  106. unshaded = false;
  107. uses_vertex = false;
  108. uses_sss = false;
  109. uses_screen_texture = false;
  110. uses_depth_texture = false;
  111. uses_normal_texture = false;
  112. uses_time = false;
  113. writes_modelview_or_projection = false;
  114. uses_world_coordinates = false;
  115. int depth_drawi = DEPTH_DRAW_OPAQUE;
  116. ShaderCompilerRD::IdentifierActions actions;
  117. actions.render_mode_values["blend_add"] = Pair<int *, int>(&blend_mode, BLEND_MODE_ADD);
  118. actions.render_mode_values["blend_mix"] = Pair<int *, int>(&blend_mode, BLEND_MODE_MIX);
  119. actions.render_mode_values["blend_sub"] = Pair<int *, int>(&blend_mode, BLEND_MODE_SUB);
  120. actions.render_mode_values["blend_mul"] = Pair<int *, int>(&blend_mode, BLEND_MODE_MUL);
  121. actions.render_mode_values["depth_draw_never"] = Pair<int *, int>(&depth_drawi, DEPTH_DRAW_DISABLED);
  122. actions.render_mode_values["depth_draw_opaque"] = Pair<int *, int>(&depth_drawi, DEPTH_DRAW_OPAQUE);
  123. actions.render_mode_values["depth_draw_always"] = Pair<int *, int>(&depth_drawi, DEPTH_DRAW_ALWAYS);
  124. actions.render_mode_values["depth_test_disabled"] = Pair<int *, int>(&depth_testi, DEPTH_TEST_DISABLED);
  125. actions.render_mode_values["cull_disabled"] = Pair<int *, int>(&cull, CULL_DISABLED);
  126. actions.render_mode_values["cull_front"] = Pair<int *, int>(&cull, CULL_FRONT);
  127. actions.render_mode_values["cull_back"] = Pair<int *, int>(&cull, CULL_BACK);
  128. actions.render_mode_flags["unshaded"] = &unshaded;
  129. actions.render_mode_flags["wireframe"] = &wireframe;
  130. actions.usage_flag_pointers["ALPHA"] = &uses_alpha;
  131. actions.render_mode_flags["depth_prepass_alpha"] = &uses_depth_pre_pass;
  132. actions.usage_flag_pointers["SSS_STRENGTH"] = &uses_sss;
  133. actions.usage_flag_pointers["SCREEN_TEXTURE"] = &uses_screen_texture;
  134. actions.usage_flag_pointers["DEPTH_TEXTURE"] = &uses_depth_texture;
  135. actions.usage_flag_pointers["NORMAL_TEXTURE"] = &uses_normal_texture;
  136. actions.usage_flag_pointers["DISCARD"] = &uses_discard;
  137. actions.usage_flag_pointers["TIME"] = &uses_time;
  138. actions.usage_flag_pointers["ROUGHNESS"] = &uses_roughness;
  139. actions.usage_flag_pointers["NORMAL"] = &uses_normal;
  140. actions.usage_flag_pointers["NORMALMAP"] = &uses_normal;
  141. actions.usage_flag_pointers["POINT_SIZE"] = &uses_point_size;
  142. actions.usage_flag_pointers["POINT_COORD"] = &uses_point_size;
  143. actions.write_flag_pointers["MODELVIEW_MATRIX"] = &writes_modelview_or_projection;
  144. actions.write_flag_pointers["PROJECTION_MATRIX"] = &writes_modelview_or_projection;
  145. actions.write_flag_pointers["VERTEX"] = &uses_vertex;
  146. actions.uniforms = &uniforms;
  147. RasterizerSceneForwardRD *scene_singleton = (RasterizerSceneForwardRD *)RasterizerSceneForwardRD::singleton;
  148. Error err = scene_singleton->shader.compiler.compile(VS::SHADER_SPATIAL, code, &actions, path, gen_code);
  149. ERR_FAIL_COND(err != OK);
  150. if (version.is_null()) {
  151. version = scene_singleton->shader.scene_shader.version_create();
  152. }
  153. depth_draw = DepthDraw(depth_drawi);
  154. depth_test = DepthTest(depth_testi);
  155. #if 0
  156. print_line("**compiling shader:");
  157. print_line("**defines:\n");
  158. for (int i = 0; i < gen_code.defines.size(); i++) {
  159. print_line(gen_code.defines[i]);
  160. }
  161. print_line("\n**uniforms:\n" + gen_code.uniforms);
  162. print_line("\n**vertex_globals:\n" + gen_code.vertex_global);
  163. print_line("\n**vertex_code:\n" + gen_code.vertex);
  164. print_line("\n**fragment_globals:\n" + gen_code.fragment_global);
  165. print_line("\n**fragment_code:\n" + gen_code.fragment);
  166. print_line("\n**light_code:\n" + gen_code.light);
  167. #endif
  168. scene_singleton->shader.scene_shader.version_set_code(version, gen_code.uniforms, gen_code.vertex_global, gen_code.vertex, gen_code.fragment_global, gen_code.light, gen_code.fragment, gen_code.defines);
  169. ERR_FAIL_COND(!scene_singleton->shader.scene_shader.version_is_valid(version));
  170. ubo_size = gen_code.uniform_total_size;
  171. ubo_offsets = gen_code.uniform_offsets;
  172. texture_uniforms = gen_code.texture_uniforms;
  173. //blend modes
  174. RD::PipelineColorBlendState::Attachment blend_attachment;
  175. switch (blend_mode) {
  176. case BLEND_MODE_MIX: {
  177. blend_attachment.enable_blend = true;
  178. blend_attachment.alpha_blend_op = RD::BLEND_OP_ADD;
  179. blend_attachment.color_blend_op = RD::BLEND_OP_ADD;
  180. blend_attachment.src_color_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA;
  181. blend_attachment.dst_color_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
  182. blend_attachment.src_alpha_blend_factor = RD::BLEND_FACTOR_ONE;
  183. blend_attachment.dst_alpha_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
  184. } break;
  185. case BLEND_MODE_ADD: {
  186. blend_attachment.enable_blend = true;
  187. blend_attachment.alpha_blend_op = RD::BLEND_OP_ADD;
  188. blend_attachment.color_blend_op = RD::BLEND_OP_ADD;
  189. blend_attachment.src_color_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA;
  190. blend_attachment.dst_color_blend_factor = RD::BLEND_FACTOR_ONE;
  191. blend_attachment.src_alpha_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA;
  192. blend_attachment.dst_alpha_blend_factor = RD::BLEND_FACTOR_ONE;
  193. uses_blend_alpha = true; //force alpha used because of blend
  194. } break;
  195. case BLEND_MODE_SUB: {
  196. blend_attachment.enable_blend = true;
  197. blend_attachment.alpha_blend_op = RD::BLEND_OP_SUBTRACT;
  198. blend_attachment.color_blend_op = RD::BLEND_OP_SUBTRACT;
  199. blend_attachment.src_color_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA;
  200. blend_attachment.dst_color_blend_factor = RD::BLEND_FACTOR_ONE;
  201. blend_attachment.src_alpha_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA;
  202. blend_attachment.dst_alpha_blend_factor = RD::BLEND_FACTOR_ONE;
  203. uses_blend_alpha = true; //force alpha used because of blend
  204. } break;
  205. case BLEND_MODE_MUL: {
  206. blend_attachment.enable_blend = true;
  207. blend_attachment.alpha_blend_op = RD::BLEND_OP_ADD;
  208. blend_attachment.color_blend_op = RD::BLEND_OP_ADD;
  209. blend_attachment.src_color_blend_factor = RD::BLEND_FACTOR_DST_COLOR;
  210. blend_attachment.dst_color_blend_factor = RD::BLEND_FACTOR_ZERO;
  211. blend_attachment.src_alpha_blend_factor = RD::BLEND_FACTOR_DST_ALPHA;
  212. blend_attachment.dst_alpha_blend_factor = RD::BLEND_FACTOR_ZERO;
  213. uses_blend_alpha = true; //force alpha used because of blend
  214. } break;
  215. }
  216. RD::PipelineColorBlendState blend_state_blend;
  217. blend_state_blend.attachments.push_back(blend_attachment);
  218. RD::PipelineColorBlendState blend_state_opaque = RD::PipelineColorBlendState::create_disabled(1);
  219. RD::PipelineColorBlendState blend_state_opaque_specular = RD::PipelineColorBlendState::create_disabled(2);
  220. //update pipelines
  221. RD::PipelineDepthStencilState depth_stencil_state;
  222. if (depth_test != DEPTH_TEST_DISABLED) {
  223. depth_stencil_state.enable_depth_test = true;
  224. depth_stencil_state.depth_compare_operator = RD::COMPARE_OP_LESS_OR_EQUAL;
  225. depth_stencil_state.enable_depth_write = depth_draw != DEPTH_DRAW_DISABLED ? true : false;
  226. }
  227. for (int i = 0; i < CULL_VARIANT_MAX; i++) {
  228. RD::PolygonCullMode cull_mode_rd_table[CULL_VARIANT_MAX][3] = {
  229. { RD::POLYGON_CULL_DISABLED, RD::POLYGON_CULL_FRONT, RD::POLYGON_CULL_BACK },
  230. { RD::POLYGON_CULL_DISABLED, RD::POLYGON_CULL_BACK, RD::POLYGON_CULL_FRONT },
  231. { RD::POLYGON_CULL_DISABLED, RD::POLYGON_CULL_DISABLED, RD::POLYGON_CULL_DISABLED }
  232. };
  233. RD::PolygonCullMode cull_mode_rd = cull_mode_rd_table[i][cull];
  234. for (int j = 0; j < VS::PRIMITIVE_MAX; j++) {
  235. RD::RenderPrimitive primitive_rd_table[VS::PRIMITIVE_MAX] = {
  236. RD::RENDER_PRIMITIVE_POINTS,
  237. RD::RENDER_PRIMITIVE_LINES,
  238. RD::RENDER_PRIMITIVE_LINESTRIPS,
  239. RD::RENDER_PRIMITIVE_TRIANGLES,
  240. RD::RENDER_PRIMITIVE_TRIANGLE_STRIPS,
  241. };
  242. RD::RenderPrimitive primitive_rd = uses_point_size ? RD::RENDER_PRIMITIVE_POINTS : primitive_rd_table[j];
  243. for (int k = 0; k < SHADER_VERSION_MAX; k++) {
  244. RD::PipelineRasterizationState raster_state;
  245. raster_state.cull_mode = cull_mode_rd;
  246. raster_state.wireframe = wireframe;
  247. RD::PipelineColorBlendState blend_state;
  248. RD::PipelineDepthStencilState depth_stencil = depth_stencil_state;
  249. if (uses_alpha || uses_blend_alpha) {
  250. if (k == SHADER_VERSION_COLOR_PASS || k == SHADER_VERSION_VCT_COLOR_PASS || k == SHADER_VERSION_LIGHTMAP_COLOR_PASS) {
  251. blend_state = blend_state_blend;
  252. if (depth_draw == DEPTH_DRAW_OPAQUE) {
  253. depth_stencil.enable_depth_write = false; //alpha does not draw depth
  254. }
  255. } else if (uses_depth_pre_pass && (k == SHADER_VERSION_DEPTH_PASS || k == SHADER_VERSION_DEPTH_PASS_DP || k == SHADER_VERSION_DEPTH_PASS_WITH_NORMAL || k == SHADER_VERSION_DEPTH_PASS_WITH_NORMAL_AND_ROUGHNESS || k == SHADER_VERSION_DEPTH_PASS_WITH_MATERIAL)) {
  256. if (k == SHADER_VERSION_DEPTH_PASS || k == SHADER_VERSION_DEPTH_PASS_DP) {
  257. //none, blend state contains nothing
  258. } else if (k == SHADER_VERSION_DEPTH_PASS_WITH_MATERIAL) {
  259. blend_state = RD::PipelineColorBlendState::create_disabled(5); //writes to normal and roughness in opaque way
  260. } else {
  261. blend_state = blend_state_opaque; //writes to normal and roughness in opaque way
  262. }
  263. } else {
  264. pipelines[i][j][k].clear();
  265. continue; // do not use this version (will error if using it is attempted)
  266. }
  267. } else {
  268. if (k == SHADER_VERSION_COLOR_PASS || k == SHADER_VERSION_VCT_COLOR_PASS || k == SHADER_VERSION_LIGHTMAP_COLOR_PASS) {
  269. blend_state = blend_state_opaque;
  270. } else if (k == SHADER_VERSION_DEPTH_PASS || k == SHADER_VERSION_DEPTH_PASS_DP) {
  271. //none, leave empty
  272. } else if (k == SHADER_VERSION_DEPTH_PASS_WITH_NORMAL || k == SHADER_VERSION_DEPTH_PASS_WITH_NORMAL_AND_ROUGHNESS) {
  273. blend_state = blend_state_opaque; //writes to normal and roughness in opaque way
  274. } else if (k == SHADER_VERSION_DEPTH_PASS_WITH_MATERIAL) {
  275. blend_state = RD::PipelineColorBlendState::create_disabled(5); //writes to normal and roughness in opaque way
  276. } else {
  277. //specular write
  278. blend_state = blend_state_opaque_specular;
  279. }
  280. }
  281. RID shader_variant = scene_singleton->shader.scene_shader.version_get_shader(version, k);
  282. pipelines[i][j][k].setup(shader_variant, primitive_rd, raster_state, RD::PipelineMultisampleState(), depth_stencil, blend_state, 0);
  283. }
  284. }
  285. }
  286. valid = true;
  287. }
  288. void RasterizerSceneForwardRD::ShaderData::set_default_texture_param(const StringName &p_name, RID p_texture) {
  289. if (!p_texture.is_valid()) {
  290. default_texture_params.erase(p_name);
  291. } else {
  292. default_texture_params[p_name] = p_texture;
  293. }
  294. }
  295. void RasterizerSceneForwardRD::ShaderData::get_param_list(List<PropertyInfo> *p_param_list) const {
  296. Map<int, StringName> order;
  297. for (Map<StringName, ShaderLanguage::ShaderNode::Uniform>::Element *E = uniforms.front(); E; E = E->next()) {
  298. if (E->get().texture_order >= 0) {
  299. order[E->get().texture_order + 100000] = E->key();
  300. } else {
  301. order[E->get().order] = E->key();
  302. }
  303. }
  304. for (Map<int, StringName>::Element *E = order.front(); E; E = E->next()) {
  305. PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniforms[E->get()]);
  306. pi.name = E->get();
  307. p_param_list->push_back(pi);
  308. }
  309. }
  310. bool RasterizerSceneForwardRD::ShaderData::is_param_texture(const StringName &p_param) const {
  311. if (!uniforms.has(p_param)) {
  312. return false;
  313. }
  314. return uniforms[p_param].texture_order >= 0;
  315. }
  316. bool RasterizerSceneForwardRD::ShaderData::is_animated() const {
  317. return false;
  318. }
  319. bool RasterizerSceneForwardRD::ShaderData::casts_shadows() const {
  320. return false;
  321. }
  322. Variant RasterizerSceneForwardRD::ShaderData::get_default_parameter(const StringName &p_parameter) const {
  323. if (uniforms.has(p_parameter)) {
  324. ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter];
  325. Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value;
  326. return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.hint);
  327. }
  328. return Variant();
  329. }
  330. RasterizerSceneForwardRD::ShaderData::ShaderData() {
  331. valid = false;
  332. uses_screen_texture = false;
  333. }
  334. RasterizerSceneForwardRD::ShaderData::~ShaderData() {
  335. RasterizerSceneForwardRD *scene_singleton = (RasterizerSceneForwardRD *)RasterizerSceneForwardRD::singleton;
  336. ERR_FAIL_COND(!scene_singleton);
  337. //pipeline variants will clear themselves if shader is gone
  338. if (version.is_valid()) {
  339. scene_singleton->shader.scene_shader.version_free(version);
  340. }
  341. }
  342. RasterizerStorageRD::ShaderData *RasterizerSceneForwardRD::_create_shader_func() {
  343. ShaderData *shader_data = memnew(ShaderData);
  344. return shader_data;
  345. }
  346. void RasterizerSceneForwardRD::MaterialData::set_render_priority(int p_priority) {
  347. priority = p_priority - VS::MATERIAL_RENDER_PRIORITY_MIN; //8 bits
  348. }
  349. void RasterizerSceneForwardRD::MaterialData::set_next_pass(RID p_pass) {
  350. next_pass = p_pass;
  351. }
  352. void RasterizerSceneForwardRD::MaterialData::update_parameters(const Map<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty) {
  353. RasterizerSceneForwardRD *scene_singleton = (RasterizerSceneForwardRD *)RasterizerSceneForwardRD::singleton;
  354. if ((uint32_t)ubo_data.size() != shader_data->ubo_size) {
  355. p_uniform_dirty = true;
  356. if (uniform_buffer.is_valid()) {
  357. RD::get_singleton()->free(uniform_buffer);
  358. uniform_buffer = RID();
  359. }
  360. ubo_data.resize(shader_data->ubo_size);
  361. if (ubo_data.size()) {
  362. uniform_buffer = RD::get_singleton()->uniform_buffer_create(ubo_data.size());
  363. memset(ubo_data.ptrw(), 0, ubo_data.size()); //clear
  364. }
  365. //clear previous uniform set
  366. if (uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(uniform_set)) {
  367. RD::get_singleton()->free(uniform_set);
  368. uniform_set = RID();
  369. }
  370. }
  371. //check whether buffer changed
  372. if (p_uniform_dirty && ubo_data.size()) {
  373. update_uniform_buffer(shader_data->uniforms, shader_data->ubo_offsets.ptr(), p_parameters, ubo_data.ptrw(), ubo_data.size(), false);
  374. RD::get_singleton()->buffer_update(uniform_buffer, 0, ubo_data.size(), ubo_data.ptrw());
  375. }
  376. uint32_t tex_uniform_count = shader_data->texture_uniforms.size();
  377. if ((uint32_t)texture_cache.size() != tex_uniform_count) {
  378. texture_cache.resize(tex_uniform_count);
  379. p_textures_dirty = true;
  380. //clear previous uniform set
  381. if (uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(uniform_set)) {
  382. RD::get_singleton()->free(uniform_set);
  383. uniform_set = RID();
  384. }
  385. }
  386. if (p_textures_dirty && tex_uniform_count) {
  387. update_textures(p_parameters, shader_data->default_texture_params, shader_data->texture_uniforms, texture_cache.ptrw(), true);
  388. }
  389. if (shader_data->ubo_size == 0 && shader_data->texture_uniforms.size() == 0) {
  390. // This material does not require an uniform set, so don't create it.
  391. return;
  392. }
  393. if (!p_textures_dirty && uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(uniform_set)) {
  394. //no reason to update uniform set, only UBO (or nothing) was needed to update
  395. return;
  396. }
  397. Vector<RD::Uniform> uniforms;
  398. {
  399. if (shader_data->ubo_size) {
  400. RD::Uniform u;
  401. u.type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  402. u.binding = 0;
  403. u.ids.push_back(uniform_buffer);
  404. uniforms.push_back(u);
  405. }
  406. const RID *textures = texture_cache.ptrw();
  407. for (uint32_t i = 0; i < tex_uniform_count; i++) {
  408. RD::Uniform u;
  409. u.type = RD::UNIFORM_TYPE_TEXTURE;
  410. u.binding = 1 + i;
  411. u.ids.push_back(textures[i]);
  412. uniforms.push_back(u);
  413. }
  414. }
  415. uniform_set = RD::get_singleton()->uniform_set_create(uniforms, scene_singleton->shader.scene_shader.version_get_shader(shader_data->version, 0), 3);
  416. }
  417. RasterizerSceneForwardRD::MaterialData::~MaterialData() {
  418. if (uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(uniform_set)) {
  419. RD::get_singleton()->free(uniform_set);
  420. }
  421. if (uniform_buffer.is_valid()) {
  422. RD::get_singleton()->free(uniform_buffer);
  423. }
  424. }
  425. RasterizerStorageRD::MaterialData *RasterizerSceneForwardRD::_create_material_func(ShaderData *p_shader) {
  426. MaterialData *material_data = memnew(MaterialData);
  427. material_data->shader_data = p_shader;
  428. material_data->last_frame = false;
  429. //update will happen later anyway so do nothing.
  430. return material_data;
  431. }
  432. RasterizerSceneForwardRD::RenderBufferDataForward::~RenderBufferDataForward() {
  433. clear();
  434. }
  435. void RasterizerSceneForwardRD::RenderBufferDataForward::clear() {
  436. if (color_fb.is_valid()) {
  437. RD::get_singleton()->free(color_fb);
  438. color_fb = RID();
  439. }
  440. }
  441. void RasterizerSceneForwardRD::RenderBufferDataForward::configure(RID p_color_buffer, RID p_depth_buffer, int p_width, int p_height, VS::ViewportMSAA p_msaa) {
  442. clear();
  443. width = p_width;
  444. height = p_height;
  445. color = p_color_buffer;
  446. depth = p_depth_buffer;
  447. {
  448. Vector<RID> fb;
  449. fb.push_back(p_color_buffer);
  450. fb.push_back(depth);
  451. color_fb = RD::get_singleton()->framebuffer_create(fb);
  452. }
  453. {
  454. Vector<RID> fb;
  455. fb.push_back(depth);
  456. depth_fb = RD::get_singleton()->framebuffer_create(fb);
  457. }
  458. {
  459. Vector<RID> fb;
  460. fb.push_back(p_color_buffer);
  461. color_only_fb = RD::get_singleton()->framebuffer_create(fb);
  462. }
  463. }
  464. RasterizerSceneRD::RenderBufferData *RasterizerSceneForwardRD::_create_render_buffer_data() {
  465. return memnew(RenderBufferDataForward);
  466. }
  467. bool RasterizerSceneForwardRD::free(RID p_rid) {
  468. if (RasterizerSceneRD::free(p_rid)) {
  469. return true;
  470. }
  471. return false;
  472. }
  473. void RasterizerSceneForwardRD::_fill_instances(RenderList::Element **p_elements, int p_element_count, bool p_for_depth) {
  474. for (int i = 0; i < p_element_count; i++) {
  475. const RenderList::Element *e = p_elements[i];
  476. InstanceData &id = scene_state.instances[i];
  477. store_transform(e->instance->transform, id.transform);
  478. store_transform(Transform(e->instance->transform.basis.inverse().transposed()), id.normal_transform);
  479. id.flags = 0;
  480. id.mask = e->instance->layer_mask;
  481. if (e->instance->base_type == VS::INSTANCE_MULTIMESH) {
  482. id.flags |= INSTANCE_DATA_FLAG_MULTIMESH;
  483. uint32_t stride;
  484. if (storage->multimesh_get_transform_format(e->instance->base) == VS::MULTIMESH_TRANSFORM_2D) {
  485. id.flags |= INSTANCE_DATA_FLAG_MULTIMESH_FORMAT_2D;
  486. stride = 2;
  487. } else {
  488. stride = 3;
  489. }
  490. if (storage->multimesh_uses_colors(e->instance->base)) {
  491. id.flags |= INSTANCE_DATA_FLAG_MULTIMESH_HAS_COLOR;
  492. stride += 1;
  493. }
  494. if (storage->multimesh_uses_custom_data(e->instance->base)) {
  495. id.flags |= INSTANCE_DATA_FLAG_MULTIMESH_HAS_CUSTOM_DATA;
  496. stride += 1;
  497. }
  498. id.flags |= (stride << INSTANCE_DATA_FLAGS_MULTIMESH_STRIDE_SHIFT);
  499. } else if (e->instance->base_type == VS::INSTANCE_MESH) {
  500. if (e->instance->skeleton.is_valid()) {
  501. id.flags |= INSTANCE_DATA_FLAG_SKELETON;
  502. }
  503. }
  504. if (p_for_depth) {
  505. id.gi_offset = 0xFFFFFFFF;
  506. continue;
  507. }
  508. //forward
  509. uint32_t reflection_count = 0;
  510. uint32_t omni_count = 0;
  511. uint32_t spot_count = 0;
  512. uint32_t decal_count = 0;
  513. if (!e->instance->reflection_probe_instances.empty()) {
  514. uint32_t rpi_count = e->instance->reflection_probe_instances.size();
  515. const RID *rpi_ptrs = e->instance->reflection_probe_instances.ptr();
  516. for (uint32_t j = 0; j < rpi_count; j++) {
  517. if (render_pass != reflection_probe_instance_get_render_pass(rpi_ptrs[j])) {
  518. continue; //not rendered this frame
  519. }
  520. RID base = reflection_probe_instance_get_probe(rpi_ptrs[j]);
  521. uint32_t mask = storage->reflection_probe_get_cull_mask(base);
  522. if (!(mask & id.mask)) {
  523. continue; //masked
  524. }
  525. if (reflection_count < 8) {
  526. id.reflection_probe_indices[reflection_count] = reflection_probe_instance_get_render_index(rpi_ptrs[j]);
  527. reflection_count++;
  528. }
  529. }
  530. }
  531. if (!e->instance->light_instances.empty()) {
  532. uint32_t light_count = e->instance->light_instances.size();
  533. const RID *light_ptrs = e->instance->light_instances.ptr();
  534. for (uint32_t j = 0; j < light_count; j++) {
  535. if (render_pass != light_instance_get_render_pass(light_ptrs[j])) {
  536. continue; //not rendered this frame
  537. }
  538. RID base = light_instance_get_base_light(light_ptrs[j]);
  539. uint32_t mask = storage->light_get_cull_mask(base);
  540. if (!(mask & id.mask)) {
  541. continue; //masked
  542. }
  543. if (storage->light_get_type(base) == VS::LIGHT_OMNI) {
  544. if (omni_count < 8) {
  545. id.omni_light_indices[omni_count] = light_instance_get_index(light_ptrs[j]);
  546. omni_count++;
  547. }
  548. } else {
  549. if (spot_count < 8) {
  550. id.spot_light_indices[spot_count] = light_instance_get_index(light_ptrs[j]);
  551. spot_count++;
  552. }
  553. }
  554. }
  555. }
  556. id.flags |= reflection_count;
  557. id.flags |= omni_count << 3;
  558. id.flags |= spot_count << 6;
  559. id.flags |= decal_count << 9;
  560. if (!e->instance->gi_probe_instances.empty()) {
  561. uint32_t written = 0;
  562. for (int j = 0; j < e->instance->gi_probe_instances.size(); j++) {
  563. RID probe = e->instance->gi_probe_instances[j];
  564. int slot = gi_probe_instance_get_slot(probe);
  565. if (slot < 0) {
  566. continue; //unallocated, dont render
  567. }
  568. if (render_pass != gi_probe_instance_get_render_pass(probe)) {
  569. continue; //not rendered in this frame
  570. }
  571. uint32_t index = gi_probe_instance_get_render_index(probe);
  572. if (written == 0) {
  573. id.gi_offset = index;
  574. written = 1;
  575. } else {
  576. id.gi_offset = index << 16;
  577. written = 2;
  578. break;
  579. }
  580. }
  581. if (written == 0) {
  582. id.gi_offset = 0xFFFFFFFF;
  583. } else if (written == 1) {
  584. id.gi_offset |= 0xFFFF0000;
  585. }
  586. } else {
  587. id.gi_offset = 0xFFFFFFFF;
  588. }
  589. }
  590. RD::get_singleton()->buffer_update(scene_state.instance_buffer, 0, sizeof(InstanceData) * p_element_count, scene_state.instances, true);
  591. }
  592. /// RENDERING ///
  593. void RasterizerSceneForwardRD::_render_list(RenderingDevice::DrawListID p_draw_list, RenderingDevice::FramebufferFormatID p_framebuffer_Format, RenderList::Element **p_elements, int p_element_count, bool p_reverse_cull, PassMode p_pass_mode, bool p_no_gi) {
  594. RD::DrawListID draw_list = p_draw_list;
  595. RD::FramebufferFormatID framebuffer_format = p_framebuffer_Format;
  596. //global scope bindings
  597. RD::get_singleton()->draw_list_bind_uniform_set(draw_list, render_base_uniform_set, 0);
  598. RD::get_singleton()->draw_list_bind_uniform_set(draw_list, render_pass_uniform_set, 1);
  599. RD::get_singleton()->draw_list_bind_uniform_set(draw_list, default_vec4_xform_uniform_set, 2);
  600. MaterialData *prev_material = nullptr;
  601. // ShaderData *prev_shader = nullptr;
  602. RID prev_vertex_array_rd;
  603. RID prev_index_array_rd;
  604. RID prev_pipeline_rd;
  605. RID prev_xforms_uniform_set;
  606. PushConstant push_constant;
  607. zeromem(&push_constant, sizeof(PushConstant));
  608. for (int i = 0; i < p_element_count; i++) {
  609. const RenderList::Element *e = p_elements[i];
  610. MaterialData *material = e->material;
  611. ShaderData *shader = material->shader_data;
  612. RID xforms_uniform_set;
  613. //find cull variant
  614. ShaderData::CullVariant cull_variant;
  615. if ((p_pass_mode == PASS_MODE_SHADOW || p_pass_mode == PASS_MODE_SHADOW_DP) && e->instance->cast_shadows == VS::SHADOW_CASTING_SETTING_DOUBLE_SIDED) {
  616. cull_variant = ShaderData::CULL_VARIANT_DOUBLE_SIDED;
  617. } else {
  618. bool mirror = e->instance->mirror;
  619. if (p_reverse_cull) {
  620. mirror = !mirror;
  621. }
  622. cull_variant = mirror ? ShaderData::CULL_VARIANT_REVERSED : ShaderData::CULL_VARIANT_NORMAL;
  623. }
  624. //find primitive and vertex format
  625. VS::PrimitiveType primitive;
  626. switch (e->instance->base_type) {
  627. case VS::INSTANCE_MESH: {
  628. primitive = storage->mesh_surface_get_primitive(e->instance->base, e->surface_index);
  629. if (e->instance->skeleton.is_valid()) {
  630. xforms_uniform_set = storage->skeleton_get_3d_uniform_set(e->instance->skeleton, default_shader_rd, 2);
  631. }
  632. } break;
  633. case VS::INSTANCE_MULTIMESH: {
  634. RID mesh = storage->multimesh_get_mesh(e->instance->base);
  635. ERR_CONTINUE(!mesh.is_valid()); //should be a bug
  636. primitive = storage->mesh_surface_get_primitive(mesh, e->surface_index);
  637. xforms_uniform_set = storage->multimesh_get_3d_uniform_set(e->instance->base, default_shader_rd, 2);
  638. } break;
  639. case VS::INSTANCE_IMMEDIATE: {
  640. ERR_CONTINUE(true); //should be a bug
  641. } break;
  642. case VS::INSTANCE_PARTICLES: {
  643. ERR_CONTINUE(true); //should be a bug
  644. } break;
  645. default: {
  646. ERR_CONTINUE(true); //should be a bug
  647. }
  648. }
  649. ShaderVersion shader_version;
  650. switch (p_pass_mode) {
  651. case PASS_MODE_COLOR:
  652. case PASS_MODE_COLOR_TRANSPARENT: {
  653. if (e->uses_lightmap) {
  654. shader_version = SHADER_VERSION_LIGHTMAP_COLOR_PASS;
  655. } else if (e->uses_vct) {
  656. shader_version = SHADER_VERSION_VCT_COLOR_PASS;
  657. } else {
  658. shader_version = SHADER_VERSION_COLOR_PASS;
  659. }
  660. } break;
  661. case PASS_MODE_COLOR_SPECULAR: {
  662. if (e->uses_lightmap) {
  663. shader_version = SHADER_VERSION_LIGHTMAP_COLOR_PASS_WITH_SEPARATE_SPECULAR;
  664. } else if (e->uses_vct) {
  665. shader_version = SHADER_VERSION_VCT_COLOR_PASS_WITH_SEPARATE_SPECULAR;
  666. } else {
  667. shader_version = SHADER_VERSION_COLOR_PASS_WITH_SEPARATE_SPECULAR;
  668. }
  669. } break;
  670. case PASS_MODE_SHADOW:
  671. case PASS_MODE_DEPTH: {
  672. shader_version = SHADER_VERSION_DEPTH_PASS;
  673. } break;
  674. case PASS_MODE_SHADOW_DP: {
  675. shader_version = SHADER_VERSION_DEPTH_PASS_DP;
  676. } break;
  677. case PASS_MODE_DEPTH_NORMAL: {
  678. shader_version = SHADER_VERSION_DEPTH_PASS_WITH_NORMAL;
  679. } break;
  680. case PASS_MODE_DEPTH_NORMAL_ROUGHNESS: {
  681. shader_version = SHADER_VERSION_DEPTH_PASS_WITH_NORMAL_AND_ROUGHNESS;
  682. } break;
  683. case PASS_MODE_DEPTH_MATERIAL: {
  684. shader_version = SHADER_VERSION_DEPTH_PASS_WITH_MATERIAL;
  685. } break;
  686. }
  687. RenderPipelineVertexFormatCacheRD *pipeline = nullptr;
  688. pipeline = &shader->pipelines[cull_variant][primitive][shader_version];
  689. RD::VertexFormatID vertex_format;
  690. RID vertex_array_rd;
  691. RID index_array_rd;
  692. switch (e->instance->base_type) {
  693. case VS::INSTANCE_MESH: {
  694. storage->mesh_surface_get_arrays_and_format(e->instance->base, e->surface_index, pipeline->get_vertex_input_mask(), vertex_array_rd, index_array_rd, vertex_format);
  695. } break;
  696. case VS::INSTANCE_MULTIMESH: {
  697. RID mesh = storage->multimesh_get_mesh(e->instance->base);
  698. ERR_CONTINUE(!mesh.is_valid()); //should be a bug
  699. storage->mesh_surface_get_arrays_and_format(mesh, e->surface_index, pipeline->get_vertex_input_mask(), vertex_array_rd, index_array_rd, vertex_format);
  700. } break;
  701. case VS::INSTANCE_IMMEDIATE: {
  702. ERR_CONTINUE(true); //should be a bug
  703. } break;
  704. case VS::INSTANCE_PARTICLES: {
  705. ERR_CONTINUE(true); //should be a bug
  706. } break;
  707. default: {
  708. ERR_CONTINUE(true); //should be a bug
  709. }
  710. }
  711. if (prev_vertex_array_rd != vertex_array_rd) {
  712. RD::get_singleton()->draw_list_bind_vertex_array(draw_list, vertex_array_rd);
  713. prev_vertex_array_rd = vertex_array_rd;
  714. }
  715. if (prev_index_array_rd != index_array_rd) {
  716. if (index_array_rd.is_valid()) {
  717. RD::get_singleton()->draw_list_bind_index_array(draw_list, index_array_rd);
  718. }
  719. prev_index_array_rd = index_array_rd;
  720. }
  721. RID pipeline_rd = pipeline->get_render_pipeline(vertex_format, framebuffer_format);
  722. if (pipeline_rd != prev_pipeline_rd) {
  723. // checking with prev shader does not make so much sense, as
  724. // the pipeline may still be different.
  725. RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, pipeline_rd);
  726. prev_pipeline_rd = pipeline_rd;
  727. }
  728. if (xforms_uniform_set.is_valid() && prev_xforms_uniform_set != xforms_uniform_set) {
  729. RD::get_singleton()->draw_list_bind_uniform_set(draw_list, xforms_uniform_set, 2);
  730. prev_xforms_uniform_set = xforms_uniform_set;
  731. }
  732. if (material != prev_material) {
  733. //update uniform set
  734. if (material->uniform_set.is_valid()) {
  735. RD::get_singleton()->draw_list_bind_uniform_set(draw_list, material->uniform_set, 3);
  736. }
  737. prev_material = material;
  738. }
  739. push_constant.index = i;
  740. RD::get_singleton()->draw_list_set_push_constant(draw_list, &push_constant, sizeof(PushConstant));
  741. switch (e->instance->base_type) {
  742. case VS::INSTANCE_MESH: {
  743. RD::get_singleton()->draw_list_draw(draw_list, index_array_rd.is_valid());
  744. } break;
  745. case VS::INSTANCE_MULTIMESH: {
  746. uint32_t instances = storage->multimesh_get_instances_to_draw(e->instance->base);
  747. RD::get_singleton()->draw_list_draw(draw_list, index_array_rd.is_valid(), instances);
  748. } break;
  749. case VS::INSTANCE_IMMEDIATE: {
  750. } break;
  751. case VS::INSTANCE_PARTICLES: {
  752. } break;
  753. default: {
  754. ERR_CONTINUE(true); //should be a bug
  755. }
  756. }
  757. }
  758. }
  759. void RasterizerSceneForwardRD::_setup_environment(RID p_environment, const CameraMatrix &p_cam_projection, const Transform &p_cam_transform, RID p_reflection_probe, bool p_no_fog, const Size2 &p_screen_pixel_size, RID p_shadow_atlas, bool p_flip_y, const Color &p_default_bg_color) {
  760. //CameraMatrix projection = p_cam_projection;
  761. //projection.flip_y(); // Vulkan and modern APIs use Y-Down
  762. CameraMatrix correction;
  763. correction.set_depth_correction(p_flip_y);
  764. CameraMatrix projection = correction * p_cam_projection;
  765. //store camera into ubo
  766. store_camera(projection, scene_state.ubo.projection_matrix);
  767. store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix);
  768. store_transform(p_cam_transform, scene_state.ubo.camera_matrix);
  769. store_transform(p_cam_transform.affine_inverse(), scene_state.ubo.inv_camera_matrix);
  770. scene_state.ubo.screen_pixel_size[0] = p_screen_pixel_size.x;
  771. scene_state.ubo.screen_pixel_size[1] = p_screen_pixel_size.y;
  772. if (p_shadow_atlas.is_valid()) {
  773. Vector2 sas = shadow_atlas_get_size(p_shadow_atlas);
  774. scene_state.ubo.shadow_atlas_pixel_size[0] = 1.0 / sas.x;
  775. scene_state.ubo.shadow_atlas_pixel_size[1] = 1.0 / sas.y;
  776. }
  777. {
  778. Vector2 dss = directional_shadow_get_size();
  779. scene_state.ubo.directional_shadow_pixel_size[0] = 1.0 / dss.x;
  780. scene_state.ubo.directional_shadow_pixel_size[1] = 1.0 / dss.y;
  781. }
  782. //time global variables
  783. scene_state.ubo.time = time;
  784. if (get_debug_draw_mode() == VS::VIEWPORT_DEBUG_DRAW_UNSHADED) {
  785. scene_state.ubo.use_ambient_light = true;
  786. scene_state.ubo.ambient_light_color_energy[0] = 1;
  787. scene_state.ubo.ambient_light_color_energy[1] = 1;
  788. scene_state.ubo.ambient_light_color_energy[2] = 1;
  789. scene_state.ubo.ambient_light_color_energy[3] = 1.0;
  790. scene_state.ubo.use_ambient_cubemap = false;
  791. scene_state.ubo.use_reflection_cubemap = false;
  792. } else if (is_environment(p_environment)) {
  793. VS::EnvironmentBG env_bg = environment_get_background(p_environment);
  794. VS::EnvironmentAmbientSource ambient_src = environment_get_ambient_light_ambient_source(p_environment);
  795. float bg_energy = environment_get_bg_energy(p_environment);
  796. scene_state.ubo.ambient_light_color_energy[3] = bg_energy;
  797. scene_state.ubo.ambient_color_sky_mix = environment_get_ambient_sky_contribution(p_environment);
  798. //ambient
  799. if (ambient_src == VS::ENV_AMBIENT_SOURCE_BG && (env_bg == VS::ENV_BG_CLEAR_COLOR || env_bg == VS::ENV_BG_COLOR)) {
  800. Color color = env_bg == VS::ENV_BG_CLEAR_COLOR ? p_default_bg_color : environment_get_bg_color(p_environment);
  801. color = color.to_linear();
  802. scene_state.ubo.ambient_light_color_energy[0] = color.r * bg_energy;
  803. scene_state.ubo.ambient_light_color_energy[1] = color.g * bg_energy;
  804. scene_state.ubo.ambient_light_color_energy[2] = color.b * bg_energy;
  805. scene_state.ubo.use_ambient_light = true;
  806. scene_state.ubo.use_ambient_cubemap = false;
  807. } else {
  808. float energy = environment_get_ambient_light_ambient_energy(p_environment);
  809. Color color = environment_get_ambient_light_color(p_environment);
  810. color = color.to_linear();
  811. scene_state.ubo.ambient_light_color_energy[0] = color.r * energy;
  812. scene_state.ubo.ambient_light_color_energy[1] = color.g * energy;
  813. scene_state.ubo.ambient_light_color_energy[2] = color.b * energy;
  814. Basis sky_transform = environment_get_sky_orientation(p_environment);
  815. sky_transform = sky_transform.inverse() * p_cam_transform.basis;
  816. store_transform_3x3(sky_transform, scene_state.ubo.radiance_inverse_xform);
  817. scene_state.ubo.use_ambient_cubemap = (ambient_src == VS::ENV_AMBIENT_SOURCE_BG && env_bg == VS::ENV_BG_SKY) || ambient_src == VS::ENV_AMBIENT_SOURCE_SKY;
  818. scene_state.ubo.use_ambient_light = scene_state.ubo.use_ambient_cubemap || ambient_src == VS::ENV_AMBIENT_SOURCE_COLOR;
  819. }
  820. //specular
  821. VS::EnvironmentReflectionSource ref_src = environment_get_reflection_source(p_environment);
  822. if ((ref_src == VS::ENV_REFLECTION_SOURCE_BG && env_bg == VS::ENV_BG_SKY) || ref_src == VS::ENV_REFLECTION_SOURCE_SKY) {
  823. scene_state.ubo.use_reflection_cubemap = true;
  824. } else {
  825. scene_state.ubo.use_reflection_cubemap = false;
  826. }
  827. } else {
  828. if (p_reflection_probe.is_valid() && storage->reflection_probe_is_interior(reflection_probe_instance_get_probe(p_reflection_probe))) {
  829. scene_state.ubo.use_ambient_light = false;
  830. } else {
  831. scene_state.ubo.use_ambient_light = true;
  832. Color clear_color = p_default_bg_color;
  833. clear_color = clear_color.to_linear();
  834. scene_state.ubo.ambient_light_color_energy[0] = clear_color.r;
  835. scene_state.ubo.ambient_light_color_energy[1] = clear_color.g;
  836. scene_state.ubo.ambient_light_color_energy[2] = clear_color.b;
  837. scene_state.ubo.ambient_light_color_energy[3] = 1.0;
  838. }
  839. scene_state.ubo.use_ambient_cubemap = false;
  840. scene_state.ubo.use_reflection_cubemap = false;
  841. }
  842. RD::get_singleton()->buffer_update(scene_state.uniform_buffer, 0, sizeof(SceneState::UBO), &scene_state.ubo, true);
  843. }
  844. void RasterizerSceneForwardRD::_add_geometry(InstanceBase *p_instance, uint32_t p_surface, RID p_material, PassMode p_pass_mode, uint32_t p_geometry_index) {
  845. RID m_src;
  846. m_src = p_instance->material_override.is_valid() ? p_instance->material_override : p_material;
  847. if (unlikely(get_debug_draw_mode() != VS::VIEWPORT_DEBUG_DRAW_DISABLED)) {
  848. if (get_debug_draw_mode() == VS::VIEWPORT_DEBUG_DRAW_OVERDRAW) {
  849. m_src = overdraw_material;
  850. } else if (get_debug_draw_mode() == VS::VIEWPORT_DEBUG_DRAW_WIREFRAME) {
  851. m_src = wireframe_material;
  852. } else if (get_debug_draw_mode() == VS::VIEWPORT_DEBUG_DRAW_LIGHTING) {
  853. m_src = default_material;
  854. }
  855. }
  856. MaterialData *material = NULL;
  857. if (m_src.is_valid()) {
  858. material = (MaterialData *)storage->material_get_data(m_src, RasterizerStorageRD::SHADER_TYPE_3D);
  859. if (!material || !material->shader_data->valid) {
  860. material = NULL;
  861. }
  862. }
  863. if (!material) {
  864. material = (MaterialData *)storage->material_get_data(default_material, RasterizerStorageRD::SHADER_TYPE_3D);
  865. m_src = default_material;
  866. }
  867. ERR_FAIL_COND(!material);
  868. _add_geometry_with_material(p_instance, p_surface, material, m_src, p_pass_mode, p_geometry_index);
  869. while (material->next_pass.is_valid()) {
  870. material = (MaterialData *)storage->material_get_data(material->next_pass, RasterizerStorageRD::SHADER_TYPE_3D);
  871. if (!material || !material->shader_data->valid)
  872. break;
  873. _add_geometry_with_material(p_instance, p_surface, material, material->next_pass, p_pass_mode, p_geometry_index);
  874. }
  875. }
  876. void RasterizerSceneForwardRD::_add_geometry_with_material(InstanceBase *p_instance, uint32_t p_surface, MaterialData *p_material, RID p_material_rid, PassMode p_pass_mode, uint32_t p_geometry_index) {
  877. bool has_read_screen_alpha = p_material->shader_data->uses_screen_texture || p_material->shader_data->uses_depth_texture || p_material->shader_data->uses_normal_texture;
  878. bool has_base_alpha = (p_material->shader_data->uses_alpha || has_read_screen_alpha);
  879. bool has_blend_alpha = p_material->shader_data->uses_blend_alpha;
  880. bool has_alpha = has_base_alpha || has_blend_alpha;
  881. if (p_material->shader_data->uses_sss) {
  882. scene_state.used_sss = true;
  883. }
  884. if (p_material->shader_data->uses_screen_texture) {
  885. scene_state.used_screen_texture = true;
  886. }
  887. if (p_material->shader_data->uses_depth_texture) {
  888. scene_state.used_depth_texture = true;
  889. }
  890. if (p_material->shader_data->uses_normal_texture) {
  891. scene_state.used_normal_texture = true;
  892. }
  893. if (p_pass_mode != PASS_MODE_COLOR && p_pass_mode != PASS_MODE_COLOR_SPECULAR) {
  894. if (has_blend_alpha || has_read_screen_alpha || (has_base_alpha && !p_material->shader_data->uses_depth_pre_pass) || p_material->shader_data->depth_draw == ShaderData::DEPTH_DRAW_DISABLED || p_material->shader_data->depth_test == ShaderData::DEPTH_TEST_DISABLED || p_instance->cast_shadows == VS::SHADOW_CASTING_SETTING_OFF) {
  895. //conditions in which no depth pass should be processed
  896. return;
  897. }
  898. if (p_pass_mode != PASS_MODE_DEPTH_MATERIAL && !p_material->shader_data->writes_modelview_or_projection && !p_material->shader_data->uses_vertex && !p_material->shader_data->uses_discard && !p_material->shader_data->uses_depth_pre_pass) {
  899. //shader does not use discard and does not write a vertex position, use generic material
  900. if (p_pass_mode == PASS_MODE_SHADOW || p_pass_mode == PASS_MODE_DEPTH) {
  901. p_material = (MaterialData *)storage->material_get_data(default_material, RasterizerStorageRD::SHADER_TYPE_3D);
  902. } else if (p_pass_mode == PASS_MODE_DEPTH_NORMAL && !p_material->shader_data->uses_normal) {
  903. p_material = (MaterialData *)storage->material_get_data(default_material, RasterizerStorageRD::SHADER_TYPE_3D);
  904. } else if (p_pass_mode == PASS_MODE_DEPTH_NORMAL_ROUGHNESS && !p_material->shader_data->uses_normal && !p_material->shader_data->uses_roughness) {
  905. p_material = (MaterialData *)storage->material_get_data(default_material, RasterizerStorageRD::SHADER_TYPE_3D);
  906. }
  907. }
  908. has_alpha = false;
  909. }
  910. RenderList::Element *e = (has_alpha || p_material->shader_data->depth_test == ShaderData::DEPTH_TEST_DISABLED) ? render_list.add_alpha_element() : render_list.add_element();
  911. if (!e)
  912. return;
  913. e->instance = p_instance;
  914. e->material = p_material;
  915. e->surface_index = p_surface;
  916. e->sort_key = 0;
  917. if (e->material->last_pass != render_pass) {
  918. if (!RD::get_singleton()->uniform_set_is_valid(e->material->uniform_set)) {
  919. //uniform set no longer valid, probably a texture changed
  920. storage->material_force_update_textures(p_material_rid, RasterizerStorageRD::SHADER_TYPE_3D);
  921. }
  922. e->material->last_pass = render_pass;
  923. e->material->index = scene_state.current_material_index++;
  924. if (e->material->shader_data->last_pass != render_pass) {
  925. e->material->shader_data->last_pass = scene_state.current_material_index++;
  926. e->material->shader_data->index = scene_state.current_shader_index++;
  927. }
  928. }
  929. e->geometry_index = p_geometry_index;
  930. e->material_index = e->material->index;
  931. e->uses_instancing = e->instance->base_type == VS::INSTANCE_MULTIMESH;
  932. e->uses_lightmap = e->instance->lightmap.is_valid();
  933. e->uses_vct = e->instance->gi_probe_instances.size();
  934. e->shader_index = e->shader_index;
  935. e->depth_layer = e->instance->depth_layer;
  936. e->priority = p_material->priority;
  937. if (p_material->shader_data->uses_time) {
  938. VisualServerRaster::redraw_request();
  939. }
  940. }
  941. void RasterizerSceneForwardRD::_fill_render_list(InstanceBase **p_cull_result, int p_cull_count, PassMode p_pass_mode, bool p_no_gi) {
  942. scene_state.current_shader_index = 0;
  943. scene_state.current_material_index = 0;
  944. scene_state.used_sss = false;
  945. scene_state.used_screen_texture = false;
  946. scene_state.used_normal_texture = false;
  947. scene_state.used_depth_texture = false;
  948. uint32_t geometry_index = 0;
  949. //fill list
  950. for (int i = 0; i < p_cull_count; i++) {
  951. InstanceBase *inst = p_cull_result[i];
  952. //add geometry for drawing
  953. switch (inst->base_type) {
  954. case VS::INSTANCE_MESH: {
  955. const RID *materials = NULL;
  956. uint32_t surface_count;
  957. materials = storage->mesh_get_surface_count_and_materials(inst->base, surface_count);
  958. if (!materials) {
  959. continue; //nothing to do
  960. }
  961. const RID *inst_materials = inst->materials.ptr();
  962. for (uint32_t j = 0; j < surface_count; j++) {
  963. RID material = inst_materials[j].is_valid() ? inst_materials[j] : materials[j];
  964. uint32_t surface_index = storage->mesh_surface_get_render_pass_index(inst->base, j, render_pass, &geometry_index);
  965. _add_geometry(inst, j, material, p_pass_mode, surface_index);
  966. }
  967. //mesh->last_pass=frame;
  968. } break;
  969. case VS::INSTANCE_MULTIMESH: {
  970. if (storage->multimesh_get_instances_to_draw(inst->base) == 0) {
  971. //not visible, 0 instances
  972. continue;
  973. }
  974. RID mesh = storage->multimesh_get_mesh(inst->base);
  975. if (!mesh.is_valid()) {
  976. continue;
  977. }
  978. const RID *materials = NULL;
  979. uint32_t surface_count;
  980. materials = storage->mesh_get_surface_count_and_materials(mesh, surface_count);
  981. if (!materials) {
  982. continue; //nothing to do
  983. }
  984. for (uint32_t j = 0; j < surface_count; j++) {
  985. uint32_t surface_index = storage->mesh_surface_get_multimesh_render_pass_index(mesh, j, render_pass, &geometry_index);
  986. _add_geometry(inst, j, materials[j], p_pass_mode, surface_index);
  987. }
  988. } break;
  989. #if 0
  990. case VS::INSTANCE_IMMEDIATE: {
  991. RasterizerStorageGLES3::Immediate *immediate = storage->immediate_owner.getornull(inst->base);
  992. ERR_CONTINUE(!immediate);
  993. _add_geometry(immediate, inst, NULL, -1, p_depth_pass, p_shadow_pass);
  994. } break;
  995. case VS::INSTANCE_PARTICLES: {
  996. RasterizerStorageGLES3::Particles *particles = storage->particles_owner.getornull(inst->base);
  997. ERR_CONTINUE(!particles);
  998. for (int j = 0; j < particles->draw_passes.size(); j++) {
  999. RID pmesh = particles->draw_passes[j];
  1000. if (!pmesh.is_valid())
  1001. continue;
  1002. RasterizerStorageGLES3::Mesh *mesh = storage->mesh_owner.getornull(pmesh);
  1003. if (!mesh)
  1004. continue; //mesh not assigned
  1005. int ssize = mesh->surfaces.size();
  1006. for (int k = 0; k < ssize; k++) {
  1007. RasterizerStorageGLES3::Surface *s = mesh->surfaces[k];
  1008. _add_geometry(s, inst, particles, -1, p_depth_pass, p_shadow_pass);
  1009. }
  1010. }
  1011. } break;
  1012. #endif
  1013. default: {
  1014. }
  1015. }
  1016. }
  1017. }
  1018. void RasterizerSceneForwardRD::_draw_sky(RD::DrawListID p_draw_list, RD::FramebufferFormatID p_fb_format, RID p_environment, const CameraMatrix &p_projection, const Transform &p_transform, float p_alpha) {
  1019. ERR_FAIL_COND(!is_environment(p_environment));
  1020. RID sky = environment_get_sky(p_environment);
  1021. ERR_FAIL_COND(!sky.is_valid());
  1022. RID panorama = sky_get_panorama_texture_rd(sky);
  1023. ERR_FAIL_COND(!panorama.is_valid());
  1024. Basis sky_transform = environment_get_sky_orientation(p_environment);
  1025. sky_transform.invert();
  1026. float multiplier = environment_get_bg_energy(p_environment);
  1027. float custom_fov = environment_get_sky_custom_fov(p_environment);
  1028. // Camera
  1029. CameraMatrix camera;
  1030. if (custom_fov) {
  1031. float near_plane = p_projection.get_z_near();
  1032. float far_plane = p_projection.get_z_far();
  1033. float aspect = p_projection.get_aspect();
  1034. camera.set_perspective(custom_fov, aspect, near_plane, far_plane);
  1035. } else {
  1036. camera = p_projection;
  1037. }
  1038. sky_transform = p_transform.basis * sky_transform;
  1039. storage->get_effects()->render_panorama(p_draw_list, p_fb_format, panorama, camera, sky_transform, 1.0, multiplier);
  1040. }
  1041. void RasterizerSceneForwardRD::_setup_reflections(RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, const Transform &p_camera_inverse_transform, RID p_environment) {
  1042. for (int i = 0; i < p_reflection_probe_cull_count; i++) {
  1043. RID rpi = p_reflection_probe_cull_result[i];
  1044. if (i >= (int)scene_state.max_reflections) {
  1045. reflection_probe_instance_set_render_index(rpi, 0); //invalid, but something needs to be set
  1046. continue;
  1047. }
  1048. reflection_probe_instance_set_render_index(rpi, i);
  1049. RID base_probe = reflection_probe_instance_get_probe(rpi);
  1050. ReflectionData &reflection_ubo = scene_state.reflections[i];
  1051. Vector3 extents = storage->reflection_probe_get_extents(base_probe);
  1052. reflection_ubo.box_extents[0] = extents.x;
  1053. reflection_ubo.box_extents[1] = extents.y;
  1054. reflection_ubo.box_extents[2] = extents.z;
  1055. reflection_ubo.index = reflection_probe_instance_get_atlas_index(rpi);
  1056. Vector3 origin_offset = storage->reflection_probe_get_origin_offset(base_probe);
  1057. reflection_ubo.box_offset[0] = origin_offset.x;
  1058. reflection_ubo.box_offset[1] = origin_offset.y;
  1059. reflection_ubo.box_offset[2] = origin_offset.z;
  1060. reflection_ubo.mask = storage->reflection_probe_get_cull_mask(base_probe);
  1061. float intensity = storage->reflection_probe_get_intensity(base_probe);
  1062. bool interior = storage->reflection_probe_is_interior(base_probe);
  1063. bool box_projection = storage->reflection_probe_is_box_projection(base_probe);
  1064. reflection_ubo.params[0] = intensity;
  1065. reflection_ubo.params[1] = 0;
  1066. reflection_ubo.params[2] = interior ? 1.0 : 0.0;
  1067. reflection_ubo.params[3] = box_projection ? 1.0 : 0.0;
  1068. if (interior) {
  1069. Color ambient_linear = storage->reflection_probe_get_interior_ambient(base_probe).to_linear();
  1070. float interior_ambient_energy = storage->reflection_probe_get_interior_ambient_energy(base_probe);
  1071. float interior_ambient_probe_contrib = storage->reflection_probe_get_interior_ambient_probe_contribution(base_probe);
  1072. reflection_ubo.ambient[0] = ambient_linear.r * interior_ambient_energy;
  1073. reflection_ubo.ambient[1] = ambient_linear.g * interior_ambient_energy;
  1074. reflection_ubo.ambient[2] = ambient_linear.b * interior_ambient_energy;
  1075. reflection_ubo.ambient[3] = interior_ambient_probe_contrib;
  1076. } else {
  1077. Color ambient_linear = storage->reflection_probe_get_interior_ambient(base_probe).to_linear();
  1078. if (is_environment(p_environment)) {
  1079. Color env_ambient_color = environment_get_ambient_light_color(p_environment).to_linear();
  1080. float env_ambient_energy = environment_get_ambient_light_ambient_energy(p_environment);
  1081. ambient_linear = env_ambient_color;
  1082. ambient_linear.r *= env_ambient_energy;
  1083. ambient_linear.g *= env_ambient_energy;
  1084. ambient_linear.b *= env_ambient_energy;
  1085. }
  1086. reflection_ubo.ambient[0] = ambient_linear.r;
  1087. reflection_ubo.ambient[1] = ambient_linear.g;
  1088. reflection_ubo.ambient[2] = ambient_linear.b;
  1089. reflection_ubo.ambient[3] = 0; //not used in exterior mode, since it just blends with regular ambient light
  1090. }
  1091. Transform transform = reflection_probe_instance_get_transform(rpi);
  1092. Transform proj = (p_camera_inverse_transform * transform).inverse();
  1093. store_transform(proj, reflection_ubo.local_matrix);
  1094. reflection_probe_instance_set_render_pass(rpi, render_pass);
  1095. }
  1096. if (p_reflection_probe_cull_count) {
  1097. RD::get_singleton()->buffer_update(scene_state.reflection_buffer, 0, MIN(scene_state.max_reflections, p_reflection_probe_cull_count) * sizeof(ReflectionData), scene_state.reflections, true);
  1098. }
  1099. }
  1100. void RasterizerSceneForwardRD::_setup_gi_probes(RID *p_gi_probe_probe_cull_result, int p_gi_probe_probe_cull_count, const Transform &p_camera_transform) {
  1101. int index = 0;
  1102. for (int i = 0; i < p_gi_probe_probe_cull_count; i++) {
  1103. RID rpi = p_gi_probe_probe_cull_result[i];
  1104. if (index >= (int)scene_state.max_gi_probes) {
  1105. continue;
  1106. }
  1107. int slot = gi_probe_instance_get_slot(rpi);
  1108. if (slot < 0) {
  1109. continue; //not usable
  1110. }
  1111. RID base_probe = gi_probe_instance_get_base_probe(rpi);
  1112. GIProbeData &gi_probe_ubo = scene_state.gi_probes[index];
  1113. Transform to_cell = gi_probe_instance_get_transform_to_cell(rpi) * p_camera_transform;
  1114. store_transform(to_cell, gi_probe_ubo.xform);
  1115. Vector3 bounds = storage->gi_probe_get_octree_size(base_probe);
  1116. gi_probe_ubo.bounds[0] = bounds.x;
  1117. gi_probe_ubo.bounds[1] = bounds.y;
  1118. gi_probe_ubo.bounds[2] = bounds.z;
  1119. gi_probe_ubo.dynamic_range = storage->gi_probe_get_dynamic_range(base_probe) * storage->gi_probe_get_energy(base_probe);
  1120. gi_probe_ubo.bias = storage->gi_probe_get_bias(base_probe);
  1121. gi_probe_ubo.normal_bias = storage->gi_probe_get_normal_bias(base_probe);
  1122. gi_probe_ubo.blend_ambient = !storage->gi_probe_is_interior(base_probe);
  1123. gi_probe_ubo.texture_slot = gi_probe_instance_get_slot(rpi);
  1124. gi_probe_ubo.anisotropy_strength = storage->gi_probe_get_anisotropy_strength(base_probe);
  1125. gi_probe_ubo.ao = storage->gi_probe_get_ao(base_probe);
  1126. gi_probe_ubo.ao_size = Math::pow(storage->gi_probe_get_ao_size(base_probe), 4.0f);
  1127. if (gi_probe_is_anisotropic()) {
  1128. gi_probe_ubo.texture_slot *= 3;
  1129. }
  1130. gi_probe_instance_set_render_index(rpi, index);
  1131. gi_probe_instance_set_render_pass(rpi, render_pass);
  1132. index++;
  1133. }
  1134. if (index) {
  1135. RD::get_singleton()->buffer_update(scene_state.gi_probe_buffer, 0, index * sizeof(GIProbeData), scene_state.gi_probes, true);
  1136. }
  1137. }
  1138. void RasterizerSceneForwardRD::_setup_lights(RID *p_light_cull_result, int p_light_cull_count, const Transform &p_camera_inverse_transform, RID p_shadow_atlas, bool p_using_shadows) {
  1139. uint32_t light_count = 0;
  1140. scene_state.ubo.directional_light_count = 0;
  1141. for (int i = 0; i < p_light_cull_count; i++) {
  1142. RID li = p_light_cull_result[i];
  1143. RID base = light_instance_get_base_light(li);
  1144. ERR_CONTINUE(base.is_null());
  1145. VS::LightType type = storage->light_get_type(base);
  1146. switch (type) {
  1147. case VS::LIGHT_DIRECTIONAL: {
  1148. if (scene_state.ubo.directional_light_count >= scene_state.max_directional_lights) {
  1149. continue;
  1150. }
  1151. DirectionalLightData &light_data = scene_state.directional_lights[scene_state.ubo.directional_light_count];
  1152. Transform light_transform = light_instance_get_base_transform(li);
  1153. Vector3 direction = p_camera_inverse_transform.basis.xform(light_transform.basis.xform(Vector3(0, 0, 1))).normalized();
  1154. light_data.direction[0] = direction.x;
  1155. light_data.direction[1] = direction.y;
  1156. light_data.direction[2] = direction.z;
  1157. float sign = storage->light_is_negative(base) ? -1 : 1;
  1158. light_data.energy = sign * storage->light_get_param(base, VS::LIGHT_PARAM_ENERGY) * Math_PI;
  1159. Color linear_col = storage->light_get_color(base).to_linear();
  1160. light_data.color[0] = linear_col.r;
  1161. light_data.color[1] = linear_col.g;
  1162. light_data.color[2] = linear_col.b;
  1163. light_data.specular = storage->light_get_param(base, VS::LIGHT_PARAM_SPECULAR);
  1164. light_data.mask = storage->light_get_cull_mask(base);
  1165. Color shadow_col = storage->light_get_shadow_color(base).to_linear();
  1166. light_data.shadow_color[0] = shadow_col.r;
  1167. light_data.shadow_color[1] = shadow_col.g;
  1168. light_data.shadow_color[2] = shadow_col.b;
  1169. light_data.shadow_enabled = p_using_shadows && storage->light_has_shadow(base);
  1170. if (light_data.shadow_enabled) {
  1171. VS::LightDirectionalShadowMode smode = storage->light_directional_get_shadow_mode(base);
  1172. int limit = smode == VS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL ? 0 : (smode == VS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_2_SPLITS ? 1 : 3);
  1173. light_data.blend_splits = storage->light_directional_get_blend_splits(base);
  1174. for (int j = 0; j < 4; j++) {
  1175. Rect2 atlas_rect = light_instance_get_directional_shadow_atlas_rect(li, j);
  1176. CameraMatrix matrix = light_instance_get_shadow_camera(li, j);
  1177. float split = light_instance_get_directional_shadow_split(li, MIN(limit, j));
  1178. CameraMatrix bias;
  1179. bias.set_light_bias();
  1180. CameraMatrix rectm;
  1181. rectm.set_light_atlas_rect(atlas_rect);
  1182. Transform modelview = (p_camera_inverse_transform * light_instance_get_shadow_transform(li, j)).inverse();
  1183. CameraMatrix shadow_mtx = rectm * bias * matrix * modelview;
  1184. light_data.shadow_split_offsets[j] = split;
  1185. store_camera(shadow_mtx, light_data.shadow_matrices[j]);
  1186. }
  1187. float fade_start = storage->light_get_param(base, VS::LIGHT_PARAM_SHADOW_FADE_START);
  1188. light_data.fade_from = -light_data.shadow_split_offsets[3] * MIN(fade_start, 0.999); //using 1.0 would break smoothstep
  1189. light_data.fade_to = -light_data.shadow_split_offsets[3];
  1190. }
  1191. scene_state.ubo.directional_light_count++;
  1192. } break;
  1193. case VS::LIGHT_SPOT:
  1194. case VS::LIGHT_OMNI: {
  1195. if (light_count >= scene_state.max_lights) {
  1196. continue;
  1197. }
  1198. Transform light_transform = light_instance_get_base_transform(li);
  1199. LightData &light_data = scene_state.lights[light_count];
  1200. float sign = storage->light_is_negative(base) ? -1 : 1;
  1201. Color linear_col = storage->light_get_color(base).to_linear();
  1202. light_data.attenuation_energy[0] = Math::make_half_float(storage->light_get_param(base, VS::LIGHT_PARAM_ATTENUATION));
  1203. light_data.attenuation_energy[1] = Math::make_half_float(sign * storage->light_get_param(base, VS::LIGHT_PARAM_ENERGY) * Math_PI);
  1204. light_data.color_specular[0] = CLAMP(uint32_t(linear_col.r * 255), 0, 255);
  1205. light_data.color_specular[1] = CLAMP(uint32_t(linear_col.g * 255), 0, 255);
  1206. light_data.color_specular[2] = CLAMP(uint32_t(linear_col.b * 255), 0, 255);
  1207. light_data.color_specular[3] = CLAMP(uint32_t(storage->light_get_param(base, VS::LIGHT_PARAM_SPECULAR) * 255), 0, 255);
  1208. light_data.inv_radius = 1.0 / MAX(0.001, storage->light_get_param(base, VS::LIGHT_PARAM_RANGE));
  1209. Vector3 pos = p_camera_inverse_transform.xform(light_transform.origin);
  1210. light_data.position[0] = pos.x;
  1211. light_data.position[1] = pos.y;
  1212. light_data.position[2] = pos.z;
  1213. Vector3 direction = p_camera_inverse_transform.basis.xform(light_transform.basis.xform(Vector3(0, 0, -1))).normalized();
  1214. light_data.direction[0] = direction.x;
  1215. light_data.direction[1] = direction.y;
  1216. light_data.direction[2] = direction.z;
  1217. light_data.cone_attenuation_angle[0] = Math::make_half_float(storage->light_get_param(base, VS::LIGHT_PARAM_SPOT_ATTENUATION));
  1218. light_data.cone_attenuation_angle[1] = Math::make_half_float(Math::cos(Math::deg2rad(storage->light_get_param(base, VS::LIGHT_PARAM_SPOT_ANGLE))));
  1219. light_data.mask = storage->light_get_cull_mask(base);
  1220. Color shadow_color = storage->light_get_shadow_color(base);
  1221. bool has_shadow = p_using_shadows && storage->light_has_shadow(base);
  1222. light_data.shadow_color_enabled[0] = CLAMP(uint32_t(shadow_color.r * 255), 0, 255);
  1223. light_data.shadow_color_enabled[1] = CLAMP(uint32_t(shadow_color.g * 255), 0, 255);
  1224. light_data.shadow_color_enabled[2] = CLAMP(uint32_t(shadow_color.b * 255), 0, 255);
  1225. light_data.shadow_color_enabled[3] = has_shadow ? 255 : 0;
  1226. light_data.atlas_rect[0] = 0;
  1227. light_data.atlas_rect[1] = 0;
  1228. light_data.atlas_rect[2] = 0;
  1229. light_data.atlas_rect[3] = 0;
  1230. if (p_using_shadows && p_shadow_atlas.is_valid() && shadow_atlas_owns_light_instance(p_shadow_atlas, li)) {
  1231. // fill in the shadow information
  1232. Rect2 rect = light_instance_get_shadow_atlas_rect(li, p_shadow_atlas);
  1233. if (type == VS::LIGHT_OMNI) {
  1234. light_data.atlas_rect[0] = rect.position.x;
  1235. light_data.atlas_rect[1] = rect.position.y;
  1236. light_data.atlas_rect[2] = rect.size.width;
  1237. light_data.atlas_rect[3] = rect.size.height * 0.5;
  1238. Transform proj = (p_camera_inverse_transform * light_transform).inverse();
  1239. store_transform(proj, light_data.shadow_matrix);
  1240. } else if (type == VS::LIGHT_SPOT) {
  1241. Transform modelview = (p_camera_inverse_transform * light_transform).inverse();
  1242. CameraMatrix bias;
  1243. bias.set_light_bias();
  1244. CameraMatrix rectm;
  1245. rectm.set_light_atlas_rect(rect);
  1246. CameraMatrix shadow_mtx = rectm * bias * light_instance_get_shadow_camera(li, 0) * modelview;
  1247. store_camera(shadow_mtx, light_data.shadow_matrix);
  1248. }
  1249. }
  1250. light_instance_set_index(li, light_count);
  1251. light_count++;
  1252. } break;
  1253. }
  1254. light_instance_set_render_pass(li, render_pass);
  1255. //update UBO for forward rendering, blit to texture for clustered
  1256. }
  1257. if (light_count) {
  1258. RD::get_singleton()->buffer_update(scene_state.light_buffer, 0, sizeof(LightData) * light_count, scene_state.lights, true);
  1259. }
  1260. if (scene_state.ubo.directional_light_count) {
  1261. RD::get_singleton()->buffer_update(scene_state.directional_light_buffer, 0, sizeof(DirectionalLightData) * scene_state.ubo.directional_light_count, scene_state.directional_lights, true);
  1262. }
  1263. }
  1264. void RasterizerSceneForwardRD::_render_scene(RID p_render_buffer, const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID *p_gi_probe_cull_result, int p_gi_probe_cull_count, RID p_environment, RID p_camera_effects, RID p_shadow_atlas, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, const Color &p_default_bg_color) {
  1265. RenderBufferDataForward *render_buffer = NULL;
  1266. if (p_render_buffer.is_valid()) {
  1267. render_buffer = (RenderBufferDataForward *)render_buffers_get_data(p_render_buffer);
  1268. }
  1269. //first of all, make a new render pass
  1270. render_pass++;
  1271. //fill up ubo
  1272. #if 0
  1273. storage->info.render.object_count += p_cull_count;
  1274. Environment *env = environment_owner.getornull(p_environment);
  1275. ShadowAtlas *shadow_atlas = shadow_atlas_owner.getornull(p_shadow_atlas);
  1276. ReflectionAtlas *reflection_atlas = reflection_atlas_owner.getornull(p_reflection_atlas);
  1277. if (shadow_atlas && shadow_atlas->size) {
  1278. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 5);
  1279. glBindTexture(GL_TEXTURE_2D, shadow_atlas->depth);
  1280. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
  1281. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
  1282. scene_state.ubo.shadow_atlas_pixel_size[0] = 1.0 / shadow_atlas->size;
  1283. scene_state.ubo.shadow_atlas_pixel_size[1] = 1.0 / shadow_atlas->size;
  1284. }
  1285. if (reflection_atlas && reflection_atlas->size) {
  1286. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 3);
  1287. glBindTexture(GL_TEXTURE_2D, reflection_atlas->color);
  1288. }
  1289. #endif
  1290. RENDER_TIMESTAMP("Setup 3D Scene");
  1291. if (get_debug_draw_mode() == VS::VIEWPORT_DEBUG_DRAW_UNSHADED) {
  1292. p_light_cull_count = 0;
  1293. p_reflection_probe_cull_count = 0;
  1294. p_gi_probe_cull_count = 0;
  1295. }
  1296. _update_render_base_uniform_set();
  1297. bool using_shadows = true;
  1298. if (p_reflection_probe.is_valid()) {
  1299. scene_state.ubo.reflection_multiplier = 0.0;
  1300. if (!storage->reflection_probe_renders_shadows(reflection_probe_instance_get_probe(p_reflection_probe))) {
  1301. using_shadows = false;
  1302. }
  1303. } else {
  1304. scene_state.ubo.reflection_multiplier = 1.0;
  1305. }
  1306. //scene_state.ubo.subsurface_scatter_width = subsurface_scatter_size;
  1307. scene_state.ubo.shadow_z_offset = 0;
  1308. scene_state.ubo.shadow_z_slope_scale = 0;
  1309. Vector2 vp_he = p_cam_projection.get_viewport_half_extents();
  1310. scene_state.ubo.viewport_size[0] = vp_he.x;
  1311. scene_state.ubo.viewport_size[1] = vp_he.y;
  1312. Size2 screen_pixel_size;
  1313. RID opaque_framebuffer;
  1314. RID depth_framebuffer;
  1315. RID alpha_framebuffer;
  1316. if (render_buffer) {
  1317. screen_pixel_size.width = 1.0 / render_buffer->width;
  1318. screen_pixel_size.height = 1.0 / render_buffer->height;
  1319. opaque_framebuffer = render_buffer->color_fb;
  1320. depth_framebuffer = render_buffer->depth_fb;
  1321. alpha_framebuffer = opaque_framebuffer;
  1322. } else if (p_reflection_probe.is_valid()) {
  1323. uint32_t resolution = reflection_probe_instance_get_resolution(p_reflection_probe);
  1324. screen_pixel_size.width = 1.0 / resolution;
  1325. screen_pixel_size.height = 1.0 / resolution;
  1326. opaque_framebuffer = reflection_probe_instance_get_framebuffer(p_reflection_probe, p_reflection_probe_pass);
  1327. depth_framebuffer = reflection_probe_instance_get_depth_framebuffer(p_reflection_probe, p_reflection_probe_pass);
  1328. alpha_framebuffer = opaque_framebuffer;
  1329. if (storage->reflection_probe_is_interior(reflection_probe_instance_get_probe(p_reflection_probe))) {
  1330. p_environment = RID(); //no environment on interiors
  1331. }
  1332. } else {
  1333. ERR_FAIL(); //bug?
  1334. }
  1335. _setup_lights(p_light_cull_result, p_light_cull_count, p_cam_transform.affine_inverse(), p_shadow_atlas, using_shadows);
  1336. _setup_reflections(p_reflection_probe_cull_result, p_reflection_probe_cull_count, p_cam_transform.affine_inverse(), p_environment);
  1337. _setup_gi_probes(p_gi_probe_cull_result, p_gi_probe_cull_count, p_cam_transform);
  1338. _setup_environment(p_environment, p_cam_projection, p_cam_transform, p_reflection_probe, p_reflection_probe.is_valid(), screen_pixel_size, p_shadow_atlas, !p_reflection_probe.is_valid(), p_default_bg_color);
  1339. render_list.clear();
  1340. _fill_render_list(p_cull_result, p_cull_count, PASS_MODE_COLOR, render_buffer == nullptr);
  1341. RID radiance_cubemap;
  1342. bool draw_sky = false;
  1343. Color clear_color;
  1344. bool keep_color = false;
  1345. if (get_debug_draw_mode() == VS::VIEWPORT_DEBUG_DRAW_OVERDRAW) {
  1346. clear_color = Color(0, 0, 0, 1); //in overdraw mode, BG should always be black
  1347. } else if (is_environment(p_environment)) {
  1348. VS::EnvironmentBG bg_mode = environment_get_background(p_environment);
  1349. float bg_energy = environment_get_bg_energy(p_environment);
  1350. switch (bg_mode) {
  1351. case VS::ENV_BG_CLEAR_COLOR: {
  1352. clear_color = p_default_bg_color;
  1353. clear_color.r *= bg_energy;
  1354. clear_color.g *= bg_energy;
  1355. clear_color.b *= bg_energy;
  1356. } break;
  1357. case VS::ENV_BG_COLOR: {
  1358. clear_color = environment_get_bg_color(p_environment);
  1359. clear_color.r *= bg_energy;
  1360. clear_color.g *= bg_energy;
  1361. clear_color.b *= bg_energy;
  1362. } break;
  1363. case VS::ENV_BG_SKY: {
  1364. RID sky = environment_get_sky(p_environment);
  1365. if (sky.is_valid()) {
  1366. radiance_cubemap = sky_get_radiance_texture_rd(sky);
  1367. draw_sky = true;
  1368. }
  1369. } break;
  1370. case VS::ENV_BG_CANVAS: {
  1371. keep_color = true;
  1372. } break;
  1373. case VS::ENV_BG_KEEP: {
  1374. keep_color = true;
  1375. } break;
  1376. case VS::ENV_BG_CAMERA_FEED: {
  1377. } break;
  1378. default: {
  1379. }
  1380. }
  1381. } else {
  1382. clear_color = p_default_bg_color;
  1383. }
  1384. _setup_render_pass_uniform_set(RID(), RID(), RID(), RID(), radiance_cubemap, p_shadow_atlas, p_reflection_atlas);
  1385. render_list.sort_by_key(false);
  1386. _fill_instances(render_list.elements, render_list.element_count, false);
  1387. bool can_continue = true; //unless the middle buffers are needed
  1388. bool debug_giprobes = get_debug_draw_mode() == VS::VIEWPORT_DEBUG_DRAW_GI_PROBE_ALBEDO || get_debug_draw_mode() == VS::VIEWPORT_DEBUG_DRAW_GI_PROBE_LIGHTING || get_debug_draw_mode() == VS::VIEWPORT_DEBUG_DRAW_GI_PROBE_EMISSION;
  1389. bool using_separate_specular = false;
  1390. bool depth_pre_pass = depth_framebuffer.is_valid();
  1391. if (depth_pre_pass) { //depth pre pass
  1392. RENDER_TIMESTAMP("Render Depth Pre-Pass");
  1393. RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(depth_framebuffer, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_CONTINUE, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_CONTINUE);
  1394. _render_list(draw_list, RD::get_singleton()->framebuffer_get_format(depth_framebuffer), render_list.elements, render_list.element_count, false, PASS_MODE_DEPTH, render_buffer == nullptr);
  1395. RD::get_singleton()->draw_list_end();
  1396. }
  1397. RENDER_TIMESTAMP("Render Opaque Pass");
  1398. {
  1399. bool will_continue = (can_continue || draw_sky || debug_giprobes);
  1400. //regular forward for now
  1401. Vector<Color> c;
  1402. c.push_back(clear_color.to_linear());
  1403. RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(opaque_framebuffer, keep_color ? RD::INITIAL_ACTION_KEEP : RD::INITIAL_ACTION_CLEAR, will_continue ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ, depth_pre_pass ? RD::INITIAL_ACTION_CONTINUE : RD::INITIAL_ACTION_CLEAR, will_continue ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ, c, 1.0, 0);
  1404. _render_list(draw_list, RD::get_singleton()->framebuffer_get_format(opaque_framebuffer), render_list.elements, render_list.element_count, false, PASS_MODE_COLOR, render_buffer == nullptr);
  1405. RD::get_singleton()->draw_list_end();
  1406. }
  1407. if (debug_giprobes) {
  1408. //debug giprobes
  1409. bool will_continue = (can_continue || draw_sky);
  1410. CameraMatrix dc;
  1411. dc.set_depth_correction(true);
  1412. CameraMatrix cm = (dc * p_cam_projection) * CameraMatrix(p_cam_transform.affine_inverse());
  1413. RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(opaque_framebuffer, RD::INITIAL_ACTION_CONTINUE, will_continue ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_CONTINUE, will_continue ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ);
  1414. for (int i = 0; i < p_gi_probe_cull_count; i++) {
  1415. _debug_giprobe(p_gi_probe_cull_result[i], draw_list, opaque_framebuffer, cm, get_debug_draw_mode() == VS::VIEWPORT_DEBUG_DRAW_GI_PROBE_LIGHTING, get_debug_draw_mode() == VS::VIEWPORT_DEBUG_DRAW_GI_PROBE_EMISSION, 1.0);
  1416. }
  1417. RD::get_singleton()->draw_list_end();
  1418. }
  1419. if (draw_sky) {
  1420. RENDER_TIMESTAMP("Render Sky");
  1421. RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(opaque_framebuffer, RD::INITIAL_ACTION_CONTINUE, can_continue ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_CONTINUE, can_continue ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ);
  1422. _draw_sky(draw_list, RD::get_singleton()->framebuffer_get_format(opaque_framebuffer), p_environment, p_cam_projection, p_cam_transform, 1.0);
  1423. RD::get_singleton()->draw_list_end();
  1424. if (using_separate_specular && !can_continue) {
  1425. //can't continue, so close the buffers
  1426. //RD::get_singleton()->draw_list_begin(render_buffer->color_specular_fb, RD::INITIAL_ACTION_CONTINUE, RD::FINAL_ACTION_READ_COLOR_AND_DEPTH, c);
  1427. //RD::get_singleton()->draw_list_end();
  1428. }
  1429. }
  1430. RENDER_TIMESTAMP("Render Transparent Pass");
  1431. render_list.sort_by_reverse_depth_and_priority(true);
  1432. _fill_instances(&render_list.elements[render_list.max_elements - render_list.alpha_element_count], render_list.alpha_element_count, false);
  1433. {
  1434. RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(alpha_framebuffer, can_continue ? RD::INITIAL_ACTION_CONTINUE : RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, can_continue ? RD::INITIAL_ACTION_CONTINUE : RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ);
  1435. _render_list(draw_list, RD::get_singleton()->framebuffer_get_format(alpha_framebuffer), &render_list.elements[render_list.max_elements - render_list.alpha_element_count], render_list.alpha_element_count, false, PASS_MODE_COLOR, render_buffer == nullptr);
  1436. RD::get_singleton()->draw_list_end();
  1437. }
  1438. //_render_list
  1439. #if 0
  1440. if (state.directional_light_count == 0) {
  1441. directional_light = NULL;
  1442. _render_list(&render_list.elements[render_list.max_elements - render_list.alpha_element_count], render_list.alpha_element_count, p_cam_transform, p_cam_projection, env_radiance_tex, false, true, false, false, shadow_atlas != NULL);
  1443. } else {
  1444. for (int i = 0; i < state.directional_light_count; i++) {
  1445. directional_light = directional_lights[i];
  1446. _setup_directional_light(i, p_cam_transform.affine_inverse(), shadow_atlas != NULL && shadow_atlas->size > 0);
  1447. _render_list(&render_list.elements[render_list.max_elements - render_list.alpha_element_count], render_list.alpha_element_count, p_cam_transform, p_cam_projection, env_radiance_tex, false, true, false, i > 0, shadow_atlas != NULL);
  1448. }
  1449. }
  1450. #endif
  1451. #if 0
  1452. _post_process(env, p_cam_projection);
  1453. // Needed only for debugging
  1454. /* if (shadow_atlas && storage->frame.current_rt) {
  1455. //_copy_texture_to_front_buffer(shadow_atlas->depth);
  1456. storage->canvas->canvas_begin();
  1457. glActiveTexture(GL_TEXTURE0);
  1458. glBindTexture(GL_TEXTURE_2D, shadow_atlas->depth);
  1459. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
  1460. storage->canvas->draw_generic_textured_rect(Rect2(0, 0, storage->frame.current_rt->width / 2, storage->frame.current_rt->height / 2), Rect2(0, 0, 1, 1));
  1461. }
  1462. if (storage->frame.current_rt) {
  1463. //_copy_texture_to_front_buffer(shadow_atlas->depth);
  1464. storage->canvas->canvas_begin();
  1465. glActiveTexture(GL_TEXTURE0);
  1466. glBindTexture(GL_TEXTURE_2D, exposure_shrink[4].color);
  1467. //glBindTexture(GL_TEXTURE_2D,storage->frame.current_rt->exposure.color);
  1468. storage->canvas->draw_generic_textured_rect(Rect2(0, 0, storage->frame.current_rt->width / 16, storage->frame.current_rt->height / 16), Rect2(0, 0, 1, 1));
  1469. }
  1470. if (reflection_atlas && storage->frame.current_rt) {
  1471. //_copy_texture_to_front_buffer(shadow_atlas->depth);
  1472. storage->canvas->canvas_begin();
  1473. glActiveTexture(GL_TEXTURE0);
  1474. glBindTexture(GL_TEXTURE_2D, reflection_atlas->color);
  1475. storage->canvas->draw_generic_textured_rect(Rect2(0, 0, storage->frame.current_rt->width / 2, storage->frame.current_rt->height / 2), Rect2(0, 0, 1, 1));
  1476. }
  1477. if (directional_shadow.fbo) {
  1478. //_copy_texture_to_front_buffer(shadow_atlas->depth);
  1479. storage->canvas->canvas_begin();
  1480. glActiveTexture(GL_TEXTURE0);
  1481. glBindTexture(GL_TEXTURE_2D, directional_shadow.depth);
  1482. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
  1483. storage->canvas->draw_generic_textured_rect(Rect2(0, 0, storage->frame.current_rt->width / 2, storage->frame.current_rt->height / 2), Rect2(0, 0, 1, 1));
  1484. }
  1485. if ( env_radiance_tex) {
  1486. //_copy_texture_to_front_buffer(shadow_atlas->depth);
  1487. storage->canvas->canvas_begin();
  1488. glActiveTexture(GL_TEXTURE0);
  1489. glBindTexture(GL_TEXTURE_2D, env_radiance_tex);
  1490. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  1491. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  1492. storage->canvas->draw_generic_textured_rect(Rect2(0, 0, storage->frame.current_rt->width / 2, storage->frame.current_rt->height / 2), Rect2(0, 0, 1, 1));
  1493. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  1494. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  1495. }*/
  1496. //disable all stuff
  1497. #endif
  1498. }
  1499. void RasterizerSceneForwardRD::_render_shadow(RID p_framebuffer, InstanceBase **p_cull_result, int p_cull_count, const CameraMatrix &p_projection, const Transform &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip) {
  1500. RENDER_TIMESTAMP("Setup Rendering Shadow");
  1501. _update_render_base_uniform_set();
  1502. render_pass++;
  1503. scene_state.ubo.shadow_z_offset = p_bias;
  1504. scene_state.ubo.shadow_z_slope_scale = p_normal_bias;
  1505. scene_state.ubo.z_far = p_zfar;
  1506. scene_state.ubo.dual_paraboloid_side = p_use_dp_flip ? -1 : 1;
  1507. _setup_environment(RID(), p_projection, p_transform, RID(), true, Vector2(1, 1), RID(), true, Color());
  1508. render_list.clear();
  1509. PassMode pass_mode = p_use_dp ? PASS_MODE_SHADOW_DP : PASS_MODE_SHADOW;
  1510. _fill_render_list(p_cull_result, p_cull_count, pass_mode, true);
  1511. _setup_render_pass_uniform_set(RID(), RID(), RID(), RID(), RID(), RID(), RID());
  1512. RENDER_TIMESTAMP("Render Shadow");
  1513. render_list.sort_by_key(false);
  1514. _fill_instances(render_list.elements, render_list.element_count, true);
  1515. {
  1516. //regular forward for now
  1517. RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_framebuffer, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ);
  1518. _render_list(draw_list, RD::get_singleton()->framebuffer_get_format(p_framebuffer), render_list.elements, render_list.element_count, p_use_dp_flip, pass_mode, true);
  1519. RD::get_singleton()->draw_list_end();
  1520. }
  1521. }
  1522. void RasterizerSceneForwardRD::_render_material(const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID p_framebuffer, const Rect2i &p_region) {
  1523. RENDER_TIMESTAMP("Setup Rendering Shadow");
  1524. _update_render_base_uniform_set();
  1525. render_pass++;
  1526. scene_state.ubo.shadow_z_offset = 0;
  1527. scene_state.ubo.shadow_z_slope_scale = 0;
  1528. scene_state.ubo.z_far = 0;
  1529. scene_state.ubo.dual_paraboloid_side = 0;
  1530. _setup_environment(RID(), p_cam_projection, p_cam_transform, RID(), true, Vector2(1, 1), RID(), false, Color());
  1531. render_list.clear();
  1532. PassMode pass_mode = PASS_MODE_DEPTH_MATERIAL;
  1533. _fill_render_list(p_cull_result, p_cull_count, pass_mode, true);
  1534. _setup_render_pass_uniform_set(RID(), RID(), RID(), RID(), RID(), RID(), RID());
  1535. RENDER_TIMESTAMP("Render Material");
  1536. render_list.sort_by_key(false);
  1537. _fill_instances(render_list.elements, render_list.element_count, true);
  1538. {
  1539. //regular forward for now
  1540. Vector<Color> clear;
  1541. clear.push_back(Color(0, 0, 0, 0));
  1542. clear.push_back(Color(0, 0, 0, 0));
  1543. clear.push_back(Color(0, 0, 0, 0));
  1544. clear.push_back(Color(0, 0, 0, 0));
  1545. clear.push_back(Color(0, 0, 0, 0));
  1546. RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_framebuffer, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ, clear, 1.0, 0, p_region);
  1547. _render_list(draw_list, RD::get_singleton()->framebuffer_get_format(p_framebuffer), render_list.elements, render_list.element_count, true, pass_mode, true);
  1548. RD::get_singleton()->draw_list_end();
  1549. }
  1550. }
  1551. void RasterizerSceneForwardRD::_update_render_base_uniform_set() {
  1552. if (render_base_uniform_set.is_null() || !RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set) || gi_probe_slots_are_dirty()) {
  1553. if (render_base_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set)) {
  1554. RD::get_singleton()->free(render_base_uniform_set);
  1555. }
  1556. Vector<RD::Uniform> uniforms;
  1557. {
  1558. RD::Uniform u;
  1559. u.type = RD::UNIFORM_TYPE_SAMPLER;
  1560. u.binding = 1;
  1561. u.ids.resize(12);
  1562. RID *ids_ptr = u.ids.ptrw();
  1563. ids_ptr[0] = storage->sampler_rd_get_default(VS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, VS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
  1564. ids_ptr[1] = storage->sampler_rd_get_default(VS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, VS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
  1565. ids_ptr[2] = storage->sampler_rd_get_default(VS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIMPAMPS, VS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
  1566. ids_ptr[3] = storage->sampler_rd_get_default(VS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, VS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
  1567. ids_ptr[4] = storage->sampler_rd_get_default(VS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIMPAMPS_ANISOTROPIC, VS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
  1568. ids_ptr[5] = storage->sampler_rd_get_default(VS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC, VS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
  1569. ids_ptr[6] = storage->sampler_rd_get_default(VS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, VS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
  1570. ids_ptr[7] = storage->sampler_rd_get_default(VS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, VS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
  1571. ids_ptr[8] = storage->sampler_rd_get_default(VS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIMPAMPS, VS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
  1572. ids_ptr[9] = storage->sampler_rd_get_default(VS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, VS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
  1573. ids_ptr[10] = storage->sampler_rd_get_default(VS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIMPAMPS_ANISOTROPIC, VS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
  1574. ids_ptr[11] = storage->sampler_rd_get_default(VS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC, VS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
  1575. uniforms.push_back(u);
  1576. }
  1577. {
  1578. RD::Uniform u;
  1579. u.binding = 2;
  1580. u.type = RD::UNIFORM_TYPE_SAMPLER;
  1581. u.ids.push_back(shadow_sampler);
  1582. uniforms.push_back(u);
  1583. }
  1584. {
  1585. RD::Uniform u;
  1586. u.binding = 3;
  1587. u.type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  1588. u.ids.push_back(scene_state.uniform_buffer);
  1589. uniforms.push_back(u);
  1590. }
  1591. {
  1592. RD::Uniform u;
  1593. u.binding = 4;
  1594. u.type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
  1595. u.ids.push_back(scene_state.instance_buffer);
  1596. uniforms.push_back(u);
  1597. }
  1598. {
  1599. RD::Uniform u;
  1600. u.binding = 5;
  1601. u.type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  1602. u.ids.push_back(scene_state.light_buffer);
  1603. uniforms.push_back(u);
  1604. }
  1605. {
  1606. RD::Uniform u;
  1607. u.binding = 6;
  1608. u.type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  1609. u.ids.push_back(scene_state.reflection_buffer);
  1610. uniforms.push_back(u);
  1611. }
  1612. {
  1613. RD::Uniform u;
  1614. u.binding = 7;
  1615. u.type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  1616. u.ids.push_back(scene_state.directional_light_buffer);
  1617. uniforms.push_back(u);
  1618. }
  1619. {
  1620. RD::Uniform u;
  1621. u.binding = 8;
  1622. u.type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  1623. u.ids.push_back(scene_state.gi_probe_buffer);
  1624. uniforms.push_back(u);
  1625. }
  1626. {
  1627. RD::Uniform u;
  1628. u.binding = 9;
  1629. u.type = RD::UNIFORM_TYPE_TEXTURE;
  1630. int slot_count = gi_probe_get_slots().size();
  1631. if (gi_probe_is_anisotropic()) {
  1632. u.ids.resize(slot_count * 3);
  1633. } else {
  1634. u.ids.resize(slot_count);
  1635. }
  1636. for (int i = 0; i < slot_count; i++) {
  1637. RID probe = gi_probe_get_slots()[i];
  1638. if (gi_probe_is_anisotropic()) {
  1639. if (probe.is_null()) {
  1640. RID empty_tex = storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_3D_WHITE);
  1641. u.ids.write[i * 3 + 0] = empty_tex;
  1642. u.ids.write[i * 3 + 1] = empty_tex;
  1643. u.ids.write[i * 3 + 2] = empty_tex;
  1644. } else {
  1645. u.ids.write[i * 3 + 0] = gi_probe_instance_get_texture(probe);
  1646. u.ids.write[i * 3 + 1] = gi_probe_instance_get_aniso_texture(probe, 0);
  1647. u.ids.write[i * 3 + 2] = gi_probe_instance_get_aniso_texture(probe, 1);
  1648. }
  1649. } else {
  1650. if (probe.is_null()) {
  1651. u.ids.write[i] = storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_3D_WHITE);
  1652. } else {
  1653. u.ids.write[i] = gi_probe_instance_get_texture(probe);
  1654. }
  1655. }
  1656. }
  1657. uniforms.push_back(u);
  1658. }
  1659. render_base_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, default_shader_rd, 0);
  1660. gi_probe_slots_make_not_dirty();
  1661. }
  1662. }
  1663. void RasterizerSceneForwardRD::_setup_render_pass_uniform_set(RID p_depth_buffer, RID p_color_buffer, RID p_normal_buffer, RID p_roughness_limit_buffer, RID p_radiance_cubemap, RID p_shadow_atlas, RID p_reflection_atlas) {
  1664. if (render_pass_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(render_pass_uniform_set)) {
  1665. RD::get_singleton()->free(render_pass_uniform_set);
  1666. }
  1667. //default render buffer and scene state uniform set
  1668. Vector<RD::Uniform> uniforms;
  1669. {
  1670. RD::Uniform u;
  1671. u.binding = 0;
  1672. u.type = RD::UNIFORM_TYPE_TEXTURE;
  1673. RID texture = p_depth_buffer.is_valid() ? p_depth_buffer : storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_WHITE);
  1674. u.ids.push_back(texture);
  1675. uniforms.push_back(u);
  1676. }
  1677. {
  1678. RD::Uniform u;
  1679. u.binding = 1;
  1680. u.type = RD::UNIFORM_TYPE_TEXTURE;
  1681. RID texture = p_color_buffer.is_valid() ? p_color_buffer : storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_BLACK);
  1682. u.ids.push_back(texture);
  1683. uniforms.push_back(u);
  1684. }
  1685. {
  1686. RD::Uniform u;
  1687. u.binding = 2;
  1688. u.type = RD::UNIFORM_TYPE_TEXTURE;
  1689. RID texture = p_normal_buffer.is_valid() ? p_normal_buffer : storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_NORMAL);
  1690. u.ids.push_back(texture);
  1691. uniforms.push_back(u);
  1692. }
  1693. {
  1694. RD::Uniform u;
  1695. u.binding = 3;
  1696. u.type = RD::UNIFORM_TYPE_TEXTURE;
  1697. RID texture = p_roughness_limit_buffer.is_valid() ? p_roughness_limit_buffer : storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_BLACK);
  1698. u.ids.push_back(texture);
  1699. uniforms.push_back(u);
  1700. }
  1701. {
  1702. RD::Uniform u;
  1703. u.binding = 4;
  1704. u.type = RD::UNIFORM_TYPE_TEXTURE;
  1705. RID texture = p_radiance_cubemap.is_valid() ? p_radiance_cubemap : storage->texture_rd_get_default(is_using_radiance_cubemap_array() ? RasterizerStorageRD::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK : RasterizerStorageRD::DEFAULT_RD_TEXTURE_CUBEMAP_BLACK);
  1706. u.ids.push_back(texture);
  1707. uniforms.push_back(u);
  1708. }
  1709. {
  1710. RID ref_texture = p_reflection_atlas.is_valid() ? reflection_atlas_get_texture(p_reflection_atlas) : RID();
  1711. RD::Uniform u;
  1712. u.binding = 5;
  1713. u.type = RD::UNIFORM_TYPE_TEXTURE;
  1714. if (ref_texture.is_valid()) {
  1715. u.ids.push_back(ref_texture);
  1716. } else {
  1717. u.ids.push_back(storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK));
  1718. }
  1719. uniforms.push_back(u);
  1720. }
  1721. {
  1722. RD::Uniform u;
  1723. u.binding = 6;
  1724. u.type = RD::UNIFORM_TYPE_TEXTURE;
  1725. RID texture;
  1726. if (p_shadow_atlas.is_valid()) {
  1727. texture = shadow_atlas_get_texture(p_shadow_atlas);
  1728. }
  1729. if (!texture.is_valid()) {
  1730. texture = storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_WHITE);
  1731. }
  1732. u.ids.push_back(texture);
  1733. uniforms.push_back(u);
  1734. }
  1735. {
  1736. RD::Uniform u;
  1737. u.binding = 7;
  1738. u.type = RD::UNIFORM_TYPE_TEXTURE;
  1739. if (directional_shadow_get_texture().is_valid()) {
  1740. u.ids.push_back(directional_shadow_get_texture());
  1741. } else {
  1742. u.ids.push_back(storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_WHITE));
  1743. }
  1744. uniforms.push_back(u);
  1745. }
  1746. render_pass_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, default_shader_rd, 1);
  1747. }
  1748. RasterizerSceneForwardRD *RasterizerSceneForwardRD::singleton = NULL;
  1749. void RasterizerSceneForwardRD::set_time(double p_time, double p_step) {
  1750. time = p_time;
  1751. RasterizerSceneRD::set_time(p_time, p_step);
  1752. }
  1753. RasterizerSceneForwardRD::RasterizerSceneForwardRD(RasterizerStorageRD *p_storage) :
  1754. RasterizerSceneRD(p_storage) {
  1755. singleton = this;
  1756. storage = p_storage;
  1757. /* SHADER */
  1758. {
  1759. String defines;
  1760. defines += "\n#define MAX_ROUGHNESS_LOD " + itos(get_roughness_layers() - 1) + ".0\n";
  1761. if (is_using_radiance_cubemap_array()) {
  1762. defines += "\n#define USE_RADIANCE_CUBEMAP_ARRAY \n";
  1763. }
  1764. uint32_t uniform_max_size = RD::get_singleton()->limit_get(RD::LIMIT_MAX_UNIFORM_BUFFER_SIZE);
  1765. { //reflections
  1766. uint32_t reflection_buffer_size;
  1767. if (uniform_max_size < 65536) {
  1768. //Yes, you guessed right, ARM again
  1769. reflection_buffer_size = uniform_max_size;
  1770. } else {
  1771. reflection_buffer_size = 65536;
  1772. }
  1773. scene_state.max_reflections = reflection_buffer_size / sizeof(ReflectionData);
  1774. scene_state.reflections = memnew_arr(ReflectionData, scene_state.max_reflections);
  1775. scene_state.reflection_buffer = RD::get_singleton()->uniform_buffer_create(reflection_buffer_size);
  1776. defines += "\n#define MAX_REFLECTION_DATA_STRUCTS " + itos(scene_state.max_reflections) + "\n";
  1777. }
  1778. { //lights
  1779. scene_state.max_lights = MIN(65536, uniform_max_size) / sizeof(LightData);
  1780. uint32_t light_buffer_size = scene_state.max_lights * sizeof(LightData);
  1781. scene_state.lights = memnew_arr(LightData, scene_state.max_lights);
  1782. scene_state.light_buffer = RD::get_singleton()->uniform_buffer_create(light_buffer_size);
  1783. defines += "\n#define MAX_LIGHT_DATA_STRUCTS " + itos(scene_state.max_lights) + "\n";
  1784. scene_state.max_directional_lights = 8;
  1785. uint32_t directional_light_buffer_size = scene_state.max_directional_lights * sizeof(DirectionalLightData);
  1786. scene_state.directional_lights = memnew_arr(DirectionalLightData, scene_state.max_directional_lights);
  1787. scene_state.directional_light_buffer = RD::get_singleton()->uniform_buffer_create(directional_light_buffer_size);
  1788. defines += "\n#define MAX_DIRECTIONAL_LIGHT_DATA_STRUCTS " + itos(scene_state.max_directional_lights) + "\n";
  1789. }
  1790. { //giprobes
  1791. int slot_count = gi_probe_get_slots().size();
  1792. if (gi_probe_is_anisotropic()) {
  1793. slot_count *= 3;
  1794. defines += "\n#define GI_PROBE_USE_ANISOTROPY\n";
  1795. }
  1796. if (gi_probe_get_quality() == GIPROBE_QUALITY_ULTRA_LOW) {
  1797. defines += "\n#define GI_PROBE_LOW_QUALITY\n";
  1798. } else if (gi_probe_get_quality() == GIPROBE_QUALITY_HIGH) {
  1799. defines += "\n#define GI_PROBE_HIGH_QUALITY\n";
  1800. }
  1801. defines += "\n#define MAX_GI_PROBE_TEXTURES " + itos(slot_count) + "\n";
  1802. uint32_t giprobe_buffer_size;
  1803. if (uniform_max_size < 65536) {
  1804. //Yes, you guessed right, ARM again
  1805. giprobe_buffer_size = uniform_max_size;
  1806. } else {
  1807. giprobe_buffer_size = 65536;
  1808. }
  1809. giprobe_buffer_size = MIN(sizeof(GIProbeData) * gi_probe_get_slots().size(), giprobe_buffer_size);
  1810. scene_state.max_gi_probes = giprobe_buffer_size / sizeof(GIProbeData);
  1811. scene_state.gi_probes = memnew_arr(GIProbeData, scene_state.max_gi_probes);
  1812. scene_state.gi_probe_buffer = RD::get_singleton()->uniform_buffer_create(sizeof(GIProbeData) * scene_state.max_gi_probes);
  1813. defines += "\n#define MAX_GI_PROBES " + itos(scene_state.max_gi_probes) + "\n";
  1814. }
  1815. Vector<String> shader_versions;
  1816. shader_versions.push_back("\n#define MODE_RENDER_DEPTH\n");
  1817. shader_versions.push_back("\n#define MODE_RENDER_DEPTH\n#define MODE_DUAL_PARABOLOID\n");
  1818. shader_versions.push_back("\n#define MODE_RENDER_DEPTH\n#define ENABLE_WRITE_NORMAL_BUFFER\n");
  1819. shader_versions.push_back("\n#define MODE_RENDER_DEPTH\n#define ENABLE_WRITE_NORMAL_ROUGHNESS_BUFFER\n");
  1820. shader_versions.push_back("\n#define MODE_RENDER_DEPTH\n#define MODE_RENDER_MATERIAL\n");
  1821. shader_versions.push_back("");
  1822. shader_versions.push_back("\n#define MODE_MULTIPLE_RENDER_TARGETS\n");
  1823. shader_versions.push_back("\n#define USE_VOXEL_CONE_TRACING\n");
  1824. shader_versions.push_back("\n#define MODE_MULTIPLE_RENDER_TARGETS\n#define USE_VOXEL_CONE_TRACING\n");
  1825. shader_versions.push_back("\n#define USE_LIGHTMAP\n");
  1826. shader_versions.push_back("\n#define MODE_MULTIPLE_RENDER_TARGETS\n#define USE_LIGHTMAP\n");
  1827. shader.scene_shader.initialize(shader_versions, defines);
  1828. }
  1829. storage->shader_set_data_request_function(RasterizerStorageRD::SHADER_TYPE_3D, _create_shader_funcs);
  1830. storage->material_set_data_request_function(RasterizerStorageRD::SHADER_TYPE_3D, _create_material_funcs);
  1831. {
  1832. //shader compiler
  1833. ShaderCompilerRD::DefaultIdentifierActions actions;
  1834. actions.renames["WORLD_MATRIX"] = "world_matrix";
  1835. actions.renames["WORLD_NORMAL_MATRIX"] = "world_normal_matrix";
  1836. actions.renames["INV_CAMERA_MATRIX"] = "scene_data.inv_camera_matrix";
  1837. actions.renames["CAMERA_MATRIX"] = "scene_data.camera_matrix";
  1838. actions.renames["PROJECTION_MATRIX"] = "projection_matrix";
  1839. actions.renames["INV_PROJECTION_MATRIX"] = "scene_data.inv_projection_matrix";
  1840. actions.renames["MODELVIEW_MATRIX"] = "modelview";
  1841. actions.renames["MODELVIEW_NORMAL_MATRIX"] = "modelview_normal";
  1842. actions.renames["VERTEX"] = "vertex";
  1843. actions.renames["NORMAL"] = "normal";
  1844. actions.renames["TANGENT"] = "tangent";
  1845. actions.renames["BINORMAL"] = "binormal";
  1846. actions.renames["POSITION"] = "position";
  1847. actions.renames["UV"] = "uv_interp";
  1848. actions.renames["UV2"] = "uv2_interp";
  1849. actions.renames["COLOR"] = "color_interp";
  1850. actions.renames["POINT_SIZE"] = "gl_PointSize";
  1851. actions.renames["INSTANCE_ID"] = "gl_InstanceIndex";
  1852. //builtins
  1853. actions.renames["TIME"] = "scene_data.time";
  1854. actions.renames["VIEWPORT_SIZE"] = "scene_data.viewport_size";
  1855. actions.renames["FRAGCOORD"] = "gl_FragCoord";
  1856. actions.renames["FRONT_FACING"] = "gl_FrontFacing";
  1857. actions.renames["NORMALMAP"] = "normalmap";
  1858. actions.renames["NORMALMAP_DEPTH"] = "normaldepth";
  1859. actions.renames["ALBEDO"] = "albedo";
  1860. actions.renames["ALPHA"] = "alpha";
  1861. actions.renames["METALLIC"] = "metallic";
  1862. actions.renames["SPECULAR"] = "specular";
  1863. actions.renames["ROUGHNESS"] = "roughness";
  1864. actions.renames["RIM"] = "rim";
  1865. actions.renames["RIM_TINT"] = "rim_tint";
  1866. actions.renames["CLEARCOAT"] = "clearcoat";
  1867. actions.renames["CLEARCOAT_GLOSS"] = "clearcoat_gloss";
  1868. actions.renames["ANISOTROPY"] = "anisotropy";
  1869. actions.renames["ANISOTROPY_FLOW"] = "anisotropy_flow";
  1870. actions.renames["SSS_STRENGTH"] = "sss_strength";
  1871. actions.renames["TRANSMISSION"] = "transmission";
  1872. actions.renames["AO"] = "ao";
  1873. actions.renames["AO_LIGHT_AFFECT"] = "ao_light_affect";
  1874. actions.renames["EMISSION"] = "emission";
  1875. actions.renames["POINT_COORD"] = "gl_PointCoord";
  1876. actions.renames["INSTANCE_CUSTOM"] = "instance_custom";
  1877. actions.renames["SCREEN_UV"] = "screen_uv";
  1878. actions.renames["SCREEN_TEXTURE"] = "color_buffer";
  1879. actions.renames["DEPTH_TEXTURE"] = "depth_buffer";
  1880. actions.renames["NORMAL_TEXTURE"] = "normal_buffer";
  1881. actions.renames["DEPTH"] = "gl_FragDepth";
  1882. actions.renames["OUTPUT_IS_SRGB"] = "true";
  1883. //for light
  1884. actions.renames["VIEW"] = "view";
  1885. actions.renames["LIGHT_COLOR"] = "light_color";
  1886. actions.renames["LIGHT"] = "light";
  1887. actions.renames["ATTENUATION"] = "attenuation";
  1888. actions.renames["DIFFUSE_LIGHT"] = "diffuse_light";
  1889. actions.renames["SPECULAR_LIGHT"] = "specular_light";
  1890. actions.usage_defines["TANGENT"] = "#define TANGENT_USED\n";
  1891. actions.usage_defines["BINORMAL"] = "@TANGENT";
  1892. actions.usage_defines["RIM"] = "#define LIGHT_RIM_USED\n";
  1893. actions.usage_defines["RIM_TINT"] = "@RIM";
  1894. actions.usage_defines["CLEARCOAT"] = "#define LIGHT_CLEARCOAT_USED\n";
  1895. actions.usage_defines["CLEARCOAT_GLOSS"] = "@CLEARCOAT";
  1896. actions.usage_defines["ANISOTROPY"] = "#define LIGHT_ANISOTROPY_USED\n";
  1897. actions.usage_defines["ANISOTROPY_FLOW"] = "@ANISOTROPY";
  1898. actions.usage_defines["AO"] = "#define AO_USED\n";
  1899. actions.usage_defines["AO_LIGHT_AFFECT"] = "#define AO_USED\n";
  1900. actions.usage_defines["UV"] = "#define UV_USED\n";
  1901. actions.usage_defines["UV2"] = "#define UV2_USED\n";
  1902. actions.usage_defines["NORMALMAP"] = "#define NORMALMAP_USED\n";
  1903. actions.usage_defines["NORMALMAP_DEPTH"] = "@NORMALMAP";
  1904. actions.usage_defines["COLOR"] = "#define COLOR_USED\n";
  1905. actions.usage_defines["INSTANCE_CUSTOM"] = "#define ENABLE_INSTANCE_CUSTOM\n";
  1906. actions.usage_defines["POSITION"] = "#define OVERRIDE_POSITION\n";
  1907. actions.usage_defines["SSS_STRENGTH"] = "#define ENABLE_SSS\n";
  1908. actions.usage_defines["TRANSMISSION"] = "#define LIGHT_TRANSMISSION_USED\n";
  1909. actions.usage_defines["SCREEN_TEXTURE"] = "#define SCREEN_TEXTURE_USED\n";
  1910. actions.usage_defines["SCREEN_UV"] = "#define SCREEN_UV_USED\n";
  1911. actions.usage_defines["DIFFUSE_LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n";
  1912. actions.usage_defines["SPECULAR_LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n";
  1913. actions.render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n";
  1914. actions.render_mode_defines["world_vertex_coords"] = "#define VERTEX_WORLD_COORDS_USED\n";
  1915. actions.render_mode_defines["ensure_correct_normals"] = "#define ENSURE_CORRECT_NORMALS\n";
  1916. actions.render_mode_defines["cull_front"] = "#define DO_SIDE_CHECK\n";
  1917. actions.render_mode_defines["cull_disabled"] = "#define DO_SIDE_CHECK\n";
  1918. bool force_lambert = GLOBAL_GET("rendering/quality/shading/force_lambert_over_burley");
  1919. if (!force_lambert) {
  1920. actions.render_mode_defines["diffuse_burley"] = "#define DIFFUSE_BURLEY\n";
  1921. }
  1922. actions.render_mode_defines["diffuse_oren_nayar"] = "#define DIFFUSE_OREN_NAYAR\n";
  1923. actions.render_mode_defines["diffuse_lambert_wrap"] = "#define DIFFUSE_LAMBERT_WRAP\n";
  1924. actions.render_mode_defines["diffuse_toon"] = "#define DIFFUSE_TOON\n";
  1925. bool force_blinn = GLOBAL_GET("rendering/quality/shading/force_blinn_over_ggx");
  1926. if (!force_blinn) {
  1927. actions.render_mode_defines["specular_schlick_ggx"] = "#define SPECULAR_SCHLICK_GGX\n";
  1928. } else {
  1929. actions.render_mode_defines["specular_schlick_ggx"] = "#define SPECULAR_BLINN\n";
  1930. }
  1931. actions.render_mode_defines["specular_blinn"] = "#define SPECULAR_BLINN\n";
  1932. actions.render_mode_defines["specular_phong"] = "#define SPECULAR_PHONG\n";
  1933. actions.render_mode_defines["specular_toon"] = "#define SPECULAR_TOON\n";
  1934. actions.render_mode_defines["specular_disabled"] = "#define SPECULAR_DISABLED\n";
  1935. actions.render_mode_defines["shadows_disabled"] = "#define SHADOWS_DISABLED\n";
  1936. actions.render_mode_defines["ambient_light_disabled"] = "#define AMBIENT_LIGHT_DISABLED\n";
  1937. actions.render_mode_defines["shadow_to_opacity"] = "#define USE_SHADOW_TO_OPACITY\n";
  1938. actions.render_mode_defines["unshaded"] = "#define MODE_UNSHADED\n";
  1939. actions.sampler_array_name = "material_samplers";
  1940. actions.base_texture_binding_index = 1;
  1941. actions.texture_layout_set = 3;
  1942. actions.base_uniform_string = "material.";
  1943. actions.base_varying_index = 10;
  1944. actions.default_filter = ShaderLanguage::FILTER_LINEAR_MIPMAP;
  1945. actions.default_repeat = ShaderLanguage::REPEAT_ENABLE;
  1946. shader.compiler.initialize(actions);
  1947. }
  1948. //render list
  1949. render_list.max_elements = GLOBAL_DEF_RST("rendering/limits/rendering/max_renderable_elements", (int)128000);
  1950. render_list.init();
  1951. render_pass = 0;
  1952. {
  1953. scene_state.max_instances = render_list.max_elements;
  1954. scene_state.instances = memnew_arr(InstanceData, scene_state.max_instances);
  1955. scene_state.instance_buffer = RD::get_singleton()->storage_buffer_create(sizeof(InstanceData) * scene_state.max_instances);
  1956. }
  1957. scene_state.uniform_buffer = RD::get_singleton()->uniform_buffer_create(sizeof(SceneState::UBO));
  1958. {
  1959. //default material and shader
  1960. default_shader = storage->shader_create();
  1961. storage->shader_set_code(default_shader, "shader_type spatial; void vertex() { ROUGHNESS = 0.8; } void fragment() { ALBEDO=vec3(0.6); ROUGHNESS=0.8; METALLIC=0.2; } \n");
  1962. default_material = storage->material_create();
  1963. storage->material_set_shader(default_material, default_shader);
  1964. MaterialData *md = (MaterialData *)storage->material_get_data(default_material, RasterizerStorageRD::SHADER_TYPE_3D);
  1965. default_shader_rd = shader.scene_shader.version_get_shader(md->shader_data->version, SHADER_VERSION_COLOR_PASS);
  1966. }
  1967. {
  1968. overdraw_material_shader = storage->shader_create();
  1969. storage->shader_set_code(overdraw_material_shader, "shader_type spatial;\nrender_mode blend_add,unshaded;\n void fragment() { ALBEDO=vec3(0.4,0.8,0.8); ALPHA=0.2; }");
  1970. overdraw_material = storage->material_create();
  1971. storage->material_set_shader(overdraw_material, overdraw_material_shader);
  1972. wireframe_material_shader = storage->shader_create();
  1973. storage->shader_set_code(wireframe_material_shader, "shader_type spatial;\nrender_mode wireframe,unshaded;\n void fragment() { ALBEDO=vec3(0.0,0.0,0.0); }");
  1974. wireframe_material = storage->material_create();
  1975. storage->material_set_shader(wireframe_material, wireframe_material_shader);
  1976. }
  1977. {
  1978. default_vec4_xform_buffer = RD::get_singleton()->storage_buffer_create(256);
  1979. Vector<RD::Uniform> uniforms;
  1980. RD::Uniform u;
  1981. u.type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
  1982. u.ids.push_back(default_vec4_xform_buffer);
  1983. u.binding = 0;
  1984. uniforms.push_back(u);
  1985. default_vec4_xform_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, default_shader_rd, 2);
  1986. }
  1987. {
  1988. RD::SamplerState sampler;
  1989. sampler.mag_filter = RD::SAMPLER_FILTER_LINEAR;
  1990. sampler.min_filter = RD::SAMPLER_FILTER_LINEAR;
  1991. sampler.enable_compare = true;
  1992. sampler.compare_op = RD::COMPARE_OP_LESS;
  1993. shadow_sampler = RD::get_singleton()->sampler_create(sampler);
  1994. }
  1995. }
  1996. RasterizerSceneForwardRD::~RasterizerSceneForwardRD() {
  1997. //clear base uniform set if still valid
  1998. if (render_pass_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(render_pass_uniform_set)) {
  1999. RD::get_singleton()->free(render_pass_uniform_set);
  2000. }
  2001. {
  2002. RD::get_singleton()->free(scene_state.reflection_buffer);
  2003. memdelete_arr(scene_state.reflections);
  2004. }
  2005. }