190 lines
4.2 KiB
GLSL
190 lines
4.2 KiB
GLSL
/* clang-format off */
|
|
#[modes]
|
|
|
|
mode_background =
|
|
mode_half_res = #define USE_HALF_RES_PASS
|
|
mode_quarter_res = #define USE_QUARTER_RES_PASS
|
|
mode_cubemap = #define USE_CUBEMAP_PASS
|
|
mode_cubemap_half_res = #define USE_CUBEMAP_PASS \n#define USE_HALF_RES_PASS
|
|
mode_cubemap_quarter_res = #define USE_CUBEMAP_PASS \n#define USE_QUARTER_RES_PASS
|
|
|
|
#[specializations]
|
|
|
|
#[vertex]
|
|
|
|
#ifdef USE_GLES_OVER_GL
|
|
#define lowp
|
|
#define mediump
|
|
#define highp
|
|
#else
|
|
precision highp float;
|
|
precision highp int;
|
|
#endif
|
|
|
|
out vec2 uv_interp;
|
|
/* clang-format on */
|
|
|
|
void main() {
|
|
// One big triangle to cover the whole screen
|
|
vec2 base_arr[3] = vec2[](vec2(-1.0, -1.0), vec2(-1.0, 3.0), vec2(3.0, -1.0));
|
|
uv_interp = base_arr[gl_VertexID];
|
|
gl_Position = vec4(uv_interp, 0.0, 1.0);
|
|
}
|
|
|
|
/* clang-format off */
|
|
#[fragment]
|
|
|
|
#define M_PI 3.14159265359
|
|
|
|
#ifdef USE_GLES_OVER_GL
|
|
#define lowp
|
|
#define mediump
|
|
#define highp
|
|
#else
|
|
#if defined(USE_HIGHP_PRECISION)
|
|
precision highp float;
|
|
precision highp int;
|
|
#else
|
|
precision mediump float;
|
|
precision mediump int;
|
|
#endif
|
|
#endif
|
|
|
|
#include "tonemap_inc.glsl"
|
|
|
|
in vec2 uv_interp;
|
|
|
|
/* clang-format on */
|
|
|
|
uniform samplerCube radiance; //texunit:-1
|
|
#ifdef USE_CUBEMAP_PASS
|
|
uniform samplerCube half_res; //texunit:-2
|
|
uniform samplerCube quarter_res; //texunit:-3
|
|
#else
|
|
uniform sampler2D half_res; //texunit:-2
|
|
uniform sampler2D quarter_res; //texunit:-3
|
|
#endif
|
|
|
|
layout(std140) uniform SceneData { //ubo:0
|
|
float pad1;
|
|
float pad2;
|
|
};
|
|
|
|
layout(std140) uniform GlobalVariableData { //ubo:1
|
|
vec4 global_variables[MAX_GLOBAL_VARIABLES];
|
|
};
|
|
|
|
struct DirectionalLightData {
|
|
vec4 direction_energy;
|
|
vec4 color_size;
|
|
bool enabled;
|
|
};
|
|
|
|
layout(std140) uniform DirectionalLights { //ubo:2
|
|
DirectionalLightData data[MAX_DIRECTIONAL_LIGHT_DATA_STRUCTS];
|
|
}
|
|
directional_lights;
|
|
|
|
/* clang-format off */
|
|
|
|
#ifdef MATERIAL_UNIFORMS_USED
|
|
layout(std140) uniform MaterialUniforms{ //ubo:3
|
|
|
|
#MATERIAL_UNIFORMS
|
|
|
|
};
|
|
#endif
|
|
/* clang-format on */
|
|
#GLOBALS
|
|
|
|
#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
|
|
|
|
// mat4 is a waste of space, but we don't have an easy way to set a mat3 uniform for now
|
|
uniform mat4 orientation;
|
|
uniform vec4 projection;
|
|
uniform vec3 position;
|
|
uniform float time;
|
|
|
|
layout(location = 0) out vec4 frag_color;
|
|
|
|
void main() {
|
|
vec3 cube_normal;
|
|
cube_normal.z = -1.0;
|
|
cube_normal.x = (uv_interp.x + projection.x) / projection.y;
|
|
cube_normal.y = (-uv_interp.y - projection.z) / projection.w;
|
|
cube_normal = mat3(orientation) * cube_normal;
|
|
cube_normal.z = -cube_normal.z;
|
|
cube_normal = normalize(cube_normal);
|
|
|
|
vec2 uv = gl_FragCoord.xy; // uv_interp * 0.5 + 0.5;
|
|
|
|
vec2 panorama_coords = vec2(atan(cube_normal.x, cube_normal.z), acos(cube_normal.y));
|
|
|
|
if (panorama_coords.x < 0.0) {
|
|
panorama_coords.x += M_PI * 2.0;
|
|
}
|
|
|
|
panorama_coords /= vec2(M_PI * 2.0, M_PI);
|
|
|
|
vec3 color = vec3(0.0, 0.0, 0.0);
|
|
float alpha = 1.0; // Only available to subpasses
|
|
vec4 half_res_color = vec4(1.0);
|
|
vec4 quarter_res_color = vec4(1.0);
|
|
vec4 custom_fog = vec4(0.0);
|
|
|
|
#ifdef USE_CUBEMAP_PASS
|
|
vec3 inverted_cube_normal = cube_normal;
|
|
inverted_cube_normal.z *= -1.0;
|
|
#ifdef USES_HALF_RES_COLOR
|
|
half_res_color = texture(samplerCube(half_res, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), inverted_cube_normal);
|
|
#endif
|
|
#ifdef USES_QUARTER_RES_COLOR
|
|
quarter_res_color = texture(samplerCube(quarter_res, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), inverted_cube_normal);
|
|
#endif
|
|
#else
|
|
#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
|
|
|
|
{
|
|
|
|
#CODE : SKY
|
|
|
|
}
|
|
|
|
// Tonemap before writing as we are writing to an sRGB framebuffer
|
|
color *= exposure;
|
|
color = apply_tonemapping(color, white);
|
|
color = linear_to_srgb(color);
|
|
|
|
#ifdef USE_BCS
|
|
color = apply_bcs(color, bcs);
|
|
#endif
|
|
|
|
#ifdef USE_COLOR_CORRECTION
|
|
color = apply_color_correction(color, color_correction);
|
|
#endif
|
|
|
|
frag_color.rgb = color;
|
|
frag_color.a = alpha;
|
|
}
|