Replace subpass textures with color in sky shader
This commit is contained in:
parent
ed9a0d0484
commit
61c67cd5e1
5 changed files with 118 additions and 69 deletions
|
@ -293,6 +293,8 @@ ProceduralSkyMaterial::ProceduralSkyMaterial() {
|
||||||
}
|
}
|
||||||
|
|
||||||
ProceduralSkyMaterial::~ProceduralSkyMaterial() {
|
ProceduralSkyMaterial::~ProceduralSkyMaterial() {
|
||||||
|
VS::get_singleton()->free(shader);
|
||||||
|
VS::get_singleton()->material_set_shader(_get_material(), RID());
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////
|
/////////////////////////////////////////
|
||||||
|
|
|
@ -410,16 +410,18 @@ RID RasterizerSceneRD::_get_sky_textures(Sky *p_sky, SkyTextureSetVersion p_vers
|
||||||
RD::Uniform u;
|
RD::Uniform u;
|
||||||
u.type = RD::UNIFORM_TYPE_TEXTURE;
|
u.type = RD::UNIFORM_TYPE_TEXTURE;
|
||||||
u.binding = 1; // half res
|
u.binding = 1; // half res
|
||||||
if (p_sky->half_res_pass.is_valid() && (p_version != SKY_TEXTURE_SET_HALF_RES) && (p_version < SKY_TEXTURE_SET_CUBEMAP_HALF_RES0 || p_version > SKY_TEXTURE_SET_CUBEMAP_HALF_RES5)) {
|
if (p_sky->half_res_pass.is_valid() && p_version != SKY_TEXTURE_SET_HALF_RES && p_version != SKY_TEXTURE_SET_CUBEMAP_HALF_RES) {
|
||||||
if (p_version >= SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES0) {
|
if (p_version >= SKY_TEXTURE_SET_CUBEMAP) {
|
||||||
u.ids.push_back(p_sky->reflection.layers[0].mipmaps[1].views[p_version - SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES0]);
|
u.ids.push_back(p_sky->reflection.layers[0].views[1]);
|
||||||
} else if (p_version >= SKY_TEXTURE_SET_CUBEMAP0) {
|
|
||||||
u.ids.push_back(p_sky->reflection.layers[0].mipmaps[1].views[p_version - SKY_TEXTURE_SET_CUBEMAP0]);
|
|
||||||
} else {
|
} else {
|
||||||
u.ids.push_back(p_sky->half_res_pass);
|
u.ids.push_back(p_sky->half_res_pass);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
u.ids.push_back(storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_WHITE));
|
if (p_version < SKY_TEXTURE_SET_CUBEMAP) {
|
||||||
|
u.ids.push_back(storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_WHITE));
|
||||||
|
} else {
|
||||||
|
u.ids.push_back(storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_CUBEMAP_BLACK));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
uniforms.push_back(u);
|
uniforms.push_back(u);
|
||||||
}
|
}
|
||||||
|
@ -427,16 +429,18 @@ RID RasterizerSceneRD::_get_sky_textures(Sky *p_sky, SkyTextureSetVersion p_vers
|
||||||
RD::Uniform u;
|
RD::Uniform u;
|
||||||
u.type = RD::UNIFORM_TYPE_TEXTURE;
|
u.type = RD::UNIFORM_TYPE_TEXTURE;
|
||||||
u.binding = 2; // quarter res
|
u.binding = 2; // quarter res
|
||||||
if (p_sky->quarter_res_pass.is_valid() && (p_version != SKY_TEXTURE_SET_QUARTER_RES) && (p_version < SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES0 || p_version > SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES5)) {
|
if (p_sky->quarter_res_pass.is_valid() && p_version != SKY_TEXTURE_SET_QUARTER_RES && p_version != SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES) {
|
||||||
if (p_version >= SKY_TEXTURE_SET_CUBEMAP_HALF_RES0) {
|
if (p_version >= SKY_TEXTURE_SET_CUBEMAP) {
|
||||||
u.ids.push_back(p_sky->reflection.layers[0].mipmaps[2].views[p_version - SKY_TEXTURE_SET_CUBEMAP_HALF_RES0]);
|
u.ids.push_back(p_sky->reflection.layers[0].views[2]);
|
||||||
} else if (p_version >= SKY_TEXTURE_SET_CUBEMAP0) {
|
|
||||||
u.ids.push_back(p_sky->reflection.layers[0].mipmaps[2].views[p_version - SKY_TEXTURE_SET_CUBEMAP0]);
|
|
||||||
} else {
|
} else {
|
||||||
u.ids.push_back(p_sky->quarter_res_pass);
|
u.ids.push_back(p_sky->quarter_res_pass);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
u.ids.push_back(storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_WHITE));
|
if (p_version < SKY_TEXTURE_SET_CUBEMAP) {
|
||||||
|
u.ids.push_back(storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_WHITE));
|
||||||
|
} else {
|
||||||
|
u.ids.push_back(storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_CUBEMAP_BLACK));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
uniforms.push_back(u);
|
uniforms.push_back(u);
|
||||||
}
|
}
|
||||||
|
@ -733,7 +737,7 @@ void RasterizerSceneRD::_update_sky(RID p_environment, const CameraMatrix &p_pro
|
||||||
cm = correction * cm;
|
cm = correction * cm;
|
||||||
|
|
||||||
if (shader_data->uses_quarter_res) {
|
if (shader_data->uses_quarter_res) {
|
||||||
RenderPipelineVertexFormatCacheRD *pipeline = &shader_data->pipelines[SKY_VERSION_QUARTER_RES];
|
RenderPipelineVertexFormatCacheRD *pipeline = &shader_data->pipelines[SKY_VERSION_CUBEMAP_QUARTER_RES];
|
||||||
|
|
||||||
Vector<Color> clear_colors;
|
Vector<Color> clear_colors;
|
||||||
clear_colors.push_back(Color(0.0, 0.0, 0.0));
|
clear_colors.push_back(Color(0.0, 0.0, 0.0));
|
||||||
|
@ -742,7 +746,7 @@ void RasterizerSceneRD::_update_sky(RID p_environment, const CameraMatrix &p_pro
|
||||||
for (int i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
Transform local_view;
|
Transform local_view;
|
||||||
local_view.set_look_at(Vector3(0, 0, 0), view_normals[i], view_up[i]);
|
local_view.set_look_at(Vector3(0, 0, 0), view_normals[i], view_up[i]);
|
||||||
RID texture_uniform_set = _get_sky_textures(sky, SkyTextureSetVersion(SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES0 + i));
|
RID texture_uniform_set = _get_sky_textures(sky, SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES);
|
||||||
|
|
||||||
cubemap_draw_list = RD::get_singleton()->draw_list_begin(sky->reflection.layers[0].mipmaps[2].framebuffers[i], RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD);
|
cubemap_draw_list = RD::get_singleton()->draw_list_begin(sky->reflection.layers[0].mipmaps[2].framebuffers[i], RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD);
|
||||||
storage->get_effects()->render_sky(cubemap_draw_list, time, sky->reflection.layers[0].mipmaps[2].framebuffers[i], sky_scene_state.sampler_uniform_set, sky_scene_state.light_uniform_set, pipeline, material->uniform_set, texture_uniform_set, cm, local_view.basis, multiplier, p_transform.origin);
|
storage->get_effects()->render_sky(cubemap_draw_list, time, sky->reflection.layers[0].mipmaps[2].framebuffers[i], sky_scene_state.sampler_uniform_set, sky_scene_state.light_uniform_set, pipeline, material->uniform_set, texture_uniform_set, cm, local_view.basis, multiplier, p_transform.origin);
|
||||||
|
@ -751,7 +755,7 @@ void RasterizerSceneRD::_update_sky(RID p_environment, const CameraMatrix &p_pro
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shader_data->uses_half_res) {
|
if (shader_data->uses_half_res) {
|
||||||
RenderPipelineVertexFormatCacheRD *pipeline = &shader_data->pipelines[SKY_VERSION_HALF_RES];
|
RenderPipelineVertexFormatCacheRD *pipeline = &shader_data->pipelines[SKY_VERSION_CUBEMAP_HALF_RES];
|
||||||
|
|
||||||
Vector<Color> clear_colors;
|
Vector<Color> clear_colors;
|
||||||
clear_colors.push_back(Color(0.0, 0.0, 0.0));
|
clear_colors.push_back(Color(0.0, 0.0, 0.0));
|
||||||
|
@ -760,7 +764,7 @@ void RasterizerSceneRD::_update_sky(RID p_environment, const CameraMatrix &p_pro
|
||||||
for (int i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
Transform local_view;
|
Transform local_view;
|
||||||
local_view.set_look_at(Vector3(0, 0, 0), view_normals[i], view_up[i]);
|
local_view.set_look_at(Vector3(0, 0, 0), view_normals[i], view_up[i]);
|
||||||
RID texture_uniform_set = _get_sky_textures(sky, SkyTextureSetVersion(SKY_TEXTURE_SET_CUBEMAP_HALF_RES0 + i));
|
RID texture_uniform_set = _get_sky_textures(sky, SKY_TEXTURE_SET_CUBEMAP_HALF_RES);
|
||||||
|
|
||||||
cubemap_draw_list = RD::get_singleton()->draw_list_begin(sky->reflection.layers[0].mipmaps[1].framebuffers[i], RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD);
|
cubemap_draw_list = RD::get_singleton()->draw_list_begin(sky->reflection.layers[0].mipmaps[1].framebuffers[i], RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD);
|
||||||
storage->get_effects()->render_sky(cubemap_draw_list, time, sky->reflection.layers[0].mipmaps[1].framebuffers[i], sky_scene_state.sampler_uniform_set, sky_scene_state.light_uniform_set, pipeline, material->uniform_set, texture_uniform_set, cm, local_view.basis, multiplier, p_transform.origin);
|
storage->get_effects()->render_sky(cubemap_draw_list, time, sky->reflection.layers[0].mipmaps[1].framebuffers[i], sky_scene_state.sampler_uniform_set, sky_scene_state.light_uniform_set, pipeline, material->uniform_set, texture_uniform_set, cm, local_view.basis, multiplier, p_transform.origin);
|
||||||
|
@ -774,7 +778,7 @@ void RasterizerSceneRD::_update_sky(RID p_environment, const CameraMatrix &p_pro
|
||||||
for (int i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
Transform local_view;
|
Transform local_view;
|
||||||
local_view.set_look_at(Vector3(0, 0, 0), view_normals[i], view_up[i]);
|
local_view.set_look_at(Vector3(0, 0, 0), view_normals[i], view_up[i]);
|
||||||
RID texture_uniform_set = _get_sky_textures(sky, SkyTextureSetVersion(SKY_TEXTURE_SET_CUBEMAP0 + i));
|
RID texture_uniform_set = _get_sky_textures(sky, SKY_TEXTURE_SET_CUBEMAP);
|
||||||
|
|
||||||
cubemap_draw_list = RD::get_singleton()->draw_list_begin(sky->reflection.layers[0].mipmaps[0].framebuffers[i], RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD);
|
cubemap_draw_list = RD::get_singleton()->draw_list_begin(sky->reflection.layers[0].mipmaps[0].framebuffers[i], RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD);
|
||||||
storage->get_effects()->render_sky(cubemap_draw_list, time, sky->reflection.layers[0].mipmaps[0].framebuffers[i], sky_scene_state.sampler_uniform_set, sky_scene_state.light_uniform_set, pipeline, material->uniform_set, texture_uniform_set, cm, local_view.basis, multiplier, p_transform.origin);
|
storage->get_effects()->render_sky(cubemap_draw_list, time, sky->reflection.layers[0].mipmaps[0].framebuffers[i], sky_scene_state.sampler_uniform_set, sky_scene_state.light_uniform_set, pipeline, material->uniform_set, texture_uniform_set, cm, local_view.basis, multiplier, p_transform.origin);
|
||||||
|
@ -829,9 +833,6 @@ void RasterizerSceneRD::SkyShaderData::set_code(const String &p_code) {
|
||||||
|
|
||||||
actions.render_mode_flags["use_half_res_pass"] = &uses_half_res;
|
actions.render_mode_flags["use_half_res_pass"] = &uses_half_res;
|
||||||
actions.render_mode_flags["use_quarter_res_pass"] = &uses_quarter_res;
|
actions.render_mode_flags["use_quarter_res_pass"] = &uses_quarter_res;
|
||||||
// TODO: Consider using usage flags instead
|
|
||||||
//actions.usage_flag_pointers["HALF_RES_TEXTURE"] = &uses_half_res;
|
|
||||||
//actions.usage_flag_pointers["QUARTER_RES_TEXTURE"] = &uses_quarter_res;
|
|
||||||
|
|
||||||
actions.usage_flag_pointers["TIME"] = &uses_time;
|
actions.usage_flag_pointers["TIME"] = &uses_time;
|
||||||
actions.usage_flag_pointers["POSITION"] = &uses_position;
|
actions.usage_flag_pointers["POSITION"] = &uses_position;
|
||||||
|
@ -3905,10 +3906,12 @@ RasterizerSceneRD::RasterizerSceneRD(RasterizerStorageRD *p_storage) {
|
||||||
|
|
||||||
// Initialize sky
|
// Initialize sky
|
||||||
Vector<String> sky_modes;
|
Vector<String> sky_modes;
|
||||||
sky_modes.push_back("\n#define AT_CUBEMAP_PASS false\n#define AT_HALF_RES_PASS false\n#define AT_QUARTER_RES_PASS false\n"); // Full size
|
sky_modes.push_back(""); // Full size
|
||||||
sky_modes.push_back("\n#define AT_CUBEMAP_PASS false\n#define AT_HALF_RES_PASS true\n#define AT_QUARTER_RES_PASS false\n"); // Half Res
|
sky_modes.push_back("\n#define USE_HALF_RES_PASS\n"); // Half Res
|
||||||
sky_modes.push_back("\n#define AT_CUBEMAP_PASS false\n#define AT_HALF_RES_PASS false\n#define AT_QUARTER_RES_PASS true\n"); // Quarter res
|
sky_modes.push_back("\n#define USE_QUARTER_RES_PASS\n"); // Quarter res
|
||||||
sky_modes.push_back("\n#define AT_CUBEMAP_PASS true\n#define AT_HALF_RES_PASS false\n#define AT_QUARTER_RES_PASS false\n"); // Cubemap
|
sky_modes.push_back("\n#define USE_CUBEMAP_PASS\n"); // Cubemap
|
||||||
|
sky_modes.push_back("\n#define USE_CUBEMAP_PASS\n#define USE_HALF_RES_PASS\n"); // Half Res Cubemap
|
||||||
|
sky_modes.push_back("\n#define USE_CUBEMAP_PASS\n#define USE_QUARTER_RES_PASS\n"); // Quarter res Cubemap
|
||||||
sky_shader.shader.initialize(sky_modes, defines);
|
sky_shader.shader.initialize(sky_modes, defines);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3926,8 +3929,8 @@ RasterizerSceneRD::RasterizerSceneRD(RasterizerStorageRD *p_storage) {
|
||||||
actions.renames["SKY_COORDS"] = "panorama_coords";
|
actions.renames["SKY_COORDS"] = "panorama_coords";
|
||||||
actions.renames["SCREEN_UV"] = "uv";
|
actions.renames["SCREEN_UV"] = "uv";
|
||||||
actions.renames["TIME"] = "params.time";
|
actions.renames["TIME"] = "params.time";
|
||||||
actions.renames["HALF_RES_TEXTURE"] = "half_res";
|
actions.renames["HALF_RES_COLOR"] = "half_res_color";
|
||||||
actions.renames["QUARTER_RES_TEXTURE"] = "quarter_res";
|
actions.renames["QUARTER_RES_COLOR"] = "quarter_res_color";
|
||||||
actions.renames["RADIANCE"] = "radiance";
|
actions.renames["RADIANCE"] = "radiance";
|
||||||
actions.renames["LIGHT0_ENABLED"] = "directional_lights.data[0].enabled";
|
actions.renames["LIGHT0_ENABLED"] = "directional_lights.data[0].enabled";
|
||||||
actions.renames["LIGHT0_DIRECTION"] = "directional_lights.data[0].direction";
|
actions.renames["LIGHT0_DIRECTION"] = "directional_lights.data[0].direction";
|
||||||
|
@ -3949,8 +3952,8 @@ RasterizerSceneRD::RasterizerSceneRD(RasterizerStorageRD *p_storage) {
|
||||||
actions.renames["AT_HALF_RES_PASS"] = "AT_HALF_RES_PASS";
|
actions.renames["AT_HALF_RES_PASS"] = "AT_HALF_RES_PASS";
|
||||||
actions.renames["AT_QUARTER_RES_PASS"] = "AT_QUARTER_RES_PASS";
|
actions.renames["AT_QUARTER_RES_PASS"] = "AT_QUARTER_RES_PASS";
|
||||||
actions.custom_samplers["RADIANCE"] = "material_samplers[3]";
|
actions.custom_samplers["RADIANCE"] = "material_samplers[3]";
|
||||||
actions.custom_samplers["SUBPASS2"] = "material_samplers[1]";
|
actions.usage_defines["HALF_RES_COLOR"] = "\n#define USES_HALF_RES_COLOR\n";
|
||||||
actions.custom_samplers["SUBPASS4"] = "material_samplers[1]";
|
actions.usage_defines["QUARTER_RES_COLOR"] = "\n#define USES_QUARTER_RES_COLOR\n";
|
||||||
|
|
||||||
actions.sampler_array_name = "material_samplers";
|
actions.sampler_array_name = "material_samplers";
|
||||||
actions.base_texture_binding_index = 1;
|
actions.base_texture_binding_index = 1;
|
||||||
|
|
|
@ -149,6 +149,8 @@ private:
|
||||||
SKY_VERSION_HALF_RES,
|
SKY_VERSION_HALF_RES,
|
||||||
SKY_VERSION_QUARTER_RES,
|
SKY_VERSION_QUARTER_RES,
|
||||||
SKY_VERSION_CUBEMAP,
|
SKY_VERSION_CUBEMAP,
|
||||||
|
SKY_VERSION_CUBEMAP_HALF_RES,
|
||||||
|
SKY_VERSION_CUBEMAP_QUARTER_RES,
|
||||||
SKY_VERSION_MAX
|
SKY_VERSION_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -222,24 +224,9 @@ private:
|
||||||
SKY_TEXTURE_SET_BACKGROUND,
|
SKY_TEXTURE_SET_BACKGROUND,
|
||||||
SKY_TEXTURE_SET_HALF_RES,
|
SKY_TEXTURE_SET_HALF_RES,
|
||||||
SKY_TEXTURE_SET_QUARTER_RES,
|
SKY_TEXTURE_SET_QUARTER_RES,
|
||||||
SKY_TEXTURE_SET_CUBEMAP0,
|
SKY_TEXTURE_SET_CUBEMAP,
|
||||||
SKY_TEXTURE_SET_CUBEMAP1,
|
SKY_TEXTURE_SET_CUBEMAP_HALF_RES,
|
||||||
SKY_TEXTURE_SET_CUBEMAP2,
|
SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES,
|
||||||
SKY_TEXTURE_SET_CUBEMAP3,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP4,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP5,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP_HALF_RES0,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP_HALF_RES1,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP_HALF_RES2,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP_HALF_RES3,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP_HALF_RES4,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP_HALF_RES5,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES0,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES1,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES2,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES3,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES4,
|
|
||||||
SKY_TEXTURE_SET_CUBEMAP_QUARTER_RES5,
|
|
||||||
SKY_TEXTURE_SET_MAX
|
SKY_TEXTURE_SET_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,19 @@ layout(push_constant, binding = 1, std430) uniform Params {
|
||||||
}
|
}
|
||||||
params;
|
params;
|
||||||
|
|
||||||
|
#define SAMPLER_NEAREST_CLAMP 0
|
||||||
|
#define SAMPLER_LINEAR_CLAMP 1
|
||||||
|
#define SAMPLER_NEAREST_WITH_MIPMAPS_CLAMP 2
|
||||||
|
#define SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP 3
|
||||||
|
#define SAMPLER_NEAREST_WITH_MIPMAPS_ANISOTROPIC_CLAMP 4
|
||||||
|
#define SAMPLER_LINEAR_WITH_MIPMAPS_ANISOTROPIC_CLAMP 5
|
||||||
|
#define SAMPLER_NEAREST_REPEAT 6
|
||||||
|
#define SAMPLER_LINEAR_REPEAT 7
|
||||||
|
#define SAMPLER_NEAREST_WITH_MIPMAPS_REPEAT 8
|
||||||
|
#define SAMPLER_LINEAR_WITH_MIPMAPS_REPEAT 9
|
||||||
|
#define SAMPLER_NEAREST_WITH_MIPMAPS_ANISOTROPIC_REPEAT 10
|
||||||
|
#define SAMPLER_LINEAR_WITH_MIPMAPS_ANISOTROPIC_REPEAT 11
|
||||||
|
|
||||||
layout(set = 0, binding = 0) uniform sampler material_samplers[12];
|
layout(set = 0, binding = 0) uniform sampler material_samplers[12];
|
||||||
|
|
||||||
#ifdef USE_MATERIAL_UNIFORMS
|
#ifdef USE_MATERIAL_UNIFORMS
|
||||||
|
@ -56,8 +69,31 @@ MATERIAL_UNIFORMS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
layout(set = 2, binding = 0) uniform textureCube radiance;
|
layout(set = 2, binding = 0) uniform textureCube radiance;
|
||||||
|
#ifdef USE_CUBEMAP_PASS
|
||||||
|
layout(set = 2, binding = 1) uniform textureCube half_res;
|
||||||
|
layout(set = 2, binding = 2) uniform textureCube quarter_res;
|
||||||
|
#else
|
||||||
layout(set = 2, binding = 1) uniform texture2D half_res;
|
layout(set = 2, binding = 1) uniform texture2D half_res;
|
||||||
layout(set = 2, binding = 2) uniform texture2D quarter_res;
|
layout(set = 2, binding = 2) uniform texture2D quarter_res;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_CUBEMAP_PASS
|
||||||
|
#define AT_CUBEMAP_PASS true
|
||||||
|
#else
|
||||||
|
#define AT_CUBEMAP_PASS false
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_HALF_RES_PASS
|
||||||
|
#define AT_HALF_RES_PASS true
|
||||||
|
#else
|
||||||
|
#define AT_HALF_RES_PASS false
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_QUARTER_RES_PASS
|
||||||
|
#define AT_QUARTER_RES_PASS true
|
||||||
|
#else
|
||||||
|
#define AT_QUARTER_RES_PASS false
|
||||||
|
#endif
|
||||||
|
|
||||||
struct DirectionalLightData {
|
struct DirectionalLightData {
|
||||||
vec3 direction;
|
vec3 direction;
|
||||||
|
@ -101,6 +137,26 @@ void main() {
|
||||||
|
|
||||||
vec3 color = vec3(0.0, 0.0, 0.0);
|
vec3 color = vec3(0.0, 0.0, 0.0);
|
||||||
float alpha = 1.0; // Only available to subpasses
|
float alpha = 1.0; // Only available to subpasses
|
||||||
|
vec4 half_res_color = vec4(1.0);
|
||||||
|
vec4 quarter_res_color = vec4(1.0);
|
||||||
|
|
||||||
|
#ifdef USE_CUBEMAP_PASS
|
||||||
|
float using_cubemap = 1.0;
|
||||||
|
#ifdef USES_HALF_RES_COLOR
|
||||||
|
half_res_color = texture(samplerCube(half_res, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), cube_normal);
|
||||||
|
#endif
|
||||||
|
#ifdef USES_QUARTER_RES_COLOR
|
||||||
|
quarter_res_color = texture(samplerCube(quarter_res, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), cube_normal);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
float using_cubemap = 0.0;
|
||||||
|
#ifdef USES_HALF_RES_COLOR
|
||||||
|
half_res_color = textureLod(sampler2D(half_res, material_samplers[SAMPLER_LINEAR_CLAMP]), uv, 0.0);
|
||||||
|
#endif
|
||||||
|
#ifdef USES_QUARTER_RES_COLOR
|
||||||
|
quarter_res_color = textureLod(sampler2D(quarter_res, material_samplers[SAMPLER_LINEAR_CLAMP]), uv, 0.0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
// unused, just here to make our compiler happy, make sure we don't execute any light code the user adds in..
|
// unused, just here to make our compiler happy, make sure we don't execute any light code the user adds in..
|
||||||
#ifndef REALLYINCLUDETHIS
|
#ifndef REALLYINCLUDETHIS
|
||||||
|
|
|
@ -288,34 +288,35 @@ ShaderTypes::ShaderTypes() {
|
||||||
/************ SKY **************************/
|
/************ SKY **************************/
|
||||||
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["TIME"] = constt(ShaderLanguage::TYPE_FLOAT);
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["TIME"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["POSITION"] = constt(ShaderLanguage::TYPE_VEC3);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["RADIANCE"] = constt(ShaderLanguage::TYPE_SAMPLERCUBE);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["AT_HALF_RES_PASS"] = constt(ShaderLanguage::TYPE_BOOL);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["AT_QUARTER_RES_PASS"] = constt(ShaderLanguage::TYPE_BOOL);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["AT_CUBEMAP_PASS"] = constt(ShaderLanguage::TYPE_BOOL);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT0_ENABLED"] = constt(ShaderLanguage::TYPE_BOOL);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT0_DIRECTION"] = constt(ShaderLanguage::TYPE_VEC3);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT0_ENERGY"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT0_COLOR"] = constt(ShaderLanguage::TYPE_VEC3);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT1_ENABLED"] = constt(ShaderLanguage::TYPE_BOOL);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT1_DIRECTION"] = constt(ShaderLanguage::TYPE_VEC3);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT1_ENERGY"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT1_COLOR"] = constt(ShaderLanguage::TYPE_VEC3);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT2_ENABLED"] = constt(ShaderLanguage::TYPE_BOOL);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT2_DIRECTION"] = constt(ShaderLanguage::TYPE_VEC3);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT2_ENERGY"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT2_COLOR"] = constt(ShaderLanguage::TYPE_VEC3);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT3_ENABLED"] = constt(ShaderLanguage::TYPE_BOOL);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT3_DIRECTION"] = constt(ShaderLanguage::TYPE_VEC3);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT3_ENERGY"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||||
|
shader_modes[VS::SHADER_SKY].functions["global"].built_ins["LIGHT3_COLOR"] = constt(ShaderLanguage::TYPE_VEC3);
|
||||||
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["COLOR"] = ShaderLanguage::TYPE_VEC3;
|
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["COLOR"] = ShaderLanguage::TYPE_VEC3;
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["ALPHA"] = ShaderLanguage::TYPE_FLOAT;
|
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["ALPHA"] = ShaderLanguage::TYPE_FLOAT;
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["EYEDIR"] = constt(ShaderLanguage::TYPE_VEC3);
|
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["EYEDIR"] = constt(ShaderLanguage::TYPE_VEC3);
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["SCREEN_UV"] = constt(ShaderLanguage::TYPE_VEC2);
|
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["SCREEN_UV"] = constt(ShaderLanguage::TYPE_VEC2);
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["SKY_COORDS"] = constt(ShaderLanguage::TYPE_VEC2);
|
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["SKY_COORDS"] = constt(ShaderLanguage::TYPE_VEC2);
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["POSITION"] = constt(ShaderLanguage::TYPE_VEC3);
|
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["HALF_RES_COLOR"] = constt(ShaderLanguage::TYPE_VEC4);
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["HALF_RES_TEXTURE"] = constt(ShaderLanguage::TYPE_SAMPLER2D);
|
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["QUARTER_RES_COLOR"] = constt(ShaderLanguage::TYPE_VEC4);
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["QUARTER_RES_TEXTURE"] = constt(ShaderLanguage::TYPE_SAMPLER2D);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["RADIANCE"] = constt(ShaderLanguage::TYPE_SAMPLERCUBE);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["AT_HALF_RES_PASS"] = constt(ShaderLanguage::TYPE_BOOL);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["AT_QUARTER_RES_PASS"] = constt(ShaderLanguage::TYPE_BOOL);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["AT_CUBEMAP_PASS"] = constt(ShaderLanguage::TYPE_BOOL);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT0_ENABLED"] = constt(ShaderLanguage::TYPE_BOOL);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT0_DIRECTION"] = constt(ShaderLanguage::TYPE_VEC3);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT0_ENERGY"] = constt(ShaderLanguage::TYPE_FLOAT);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT0_COLOR"] = constt(ShaderLanguage::TYPE_VEC3);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT1_ENABLED"] = constt(ShaderLanguage::TYPE_BOOL);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT1_DIRECTION"] = constt(ShaderLanguage::TYPE_VEC3);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT1_ENERGY"] = constt(ShaderLanguage::TYPE_FLOAT);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT1_COLOR"] = constt(ShaderLanguage::TYPE_VEC3);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT2_ENABLED"] = constt(ShaderLanguage::TYPE_BOOL);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT2_DIRECTION"] = constt(ShaderLanguage::TYPE_VEC3);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT2_ENERGY"] = constt(ShaderLanguage::TYPE_FLOAT);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT2_COLOR"] = constt(ShaderLanguage::TYPE_VEC3);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT3_ENABLED"] = constt(ShaderLanguage::TYPE_BOOL);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT3_DIRECTION"] = constt(ShaderLanguage::TYPE_VEC3);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT3_ENERGY"] = constt(ShaderLanguage::TYPE_FLOAT);
|
|
||||||
shader_modes[VS::SHADER_SKY].functions["fragment"].built_ins["LIGHT3_COLOR"] = constt(ShaderLanguage::TYPE_VEC3);
|
|
||||||
|
|
||||||
shader_modes[VS::SHADER_SKY].modes.push_back("use_half_res_pass");
|
shader_modes[VS::SHADER_SKY].modes.push_back("use_half_res_pass");
|
||||||
shader_modes[VS::SHADER_SKY].modes.push_back("use_quarter_res_pass");
|
shader_modes[VS::SHADER_SKY].modes.push_back("use_quarter_res_pass");
|
||||||
|
|
Loading…
Reference in a new issue