65 lines
1.4 KiB
GLSL
65 lines
1.4 KiB
GLSL
#type vertex
|
||
#version 430
|
||
|
||
layout(location = 0) in vec3 a_Position;
|
||
layout(location = 1) in vec2 a_TexCoord;
|
||
|
||
out vec2 v_TexCoord;
|
||
|
||
void main()
|
||
{
|
||
vec4 position = vec4(a_Position.xy, 0.0, 1.0);
|
||
v_TexCoord = a_TexCoord;
|
||
gl_Position = position;
|
||
}
|
||
|
||
#type fragment
|
||
#version 430
|
||
|
||
layout(location = 0) out vec4 o_Color;
|
||
|
||
in vec2 v_TexCoord;
|
||
|
||
uniform sampler2D u_HDRTexture; // 来自 LightingPass 的 HDR 颜色
|
||
uniform sampler2D u_BloomTexture; // 来自 BloomBlendPass 的 Bloom 纹理
|
||
|
||
uniform bool u_EnableAutoExposure;
|
||
uniform float u_ManualExposure;
|
||
layout(std430, binding = 2) buffer Exposure
|
||
{
|
||
float u_Exposure;
|
||
};
|
||
|
||
uniform bool u_EnableBloom;
|
||
|
||
const float gamma = 2.2;
|
||
const float pureWhite = 1.0;
|
||
|
||
void main()
|
||
{
|
||
// 采样 HDR 颜色(单样本)
|
||
vec3 color = texture(u_HDRTexture, v_TexCoord).rgb;
|
||
|
||
// 混合 Bloom(如果启用)
|
||
if (u_EnableBloom)
|
||
{
|
||
vec3 bloomColor = texture(u_BloomTexture, v_TexCoord).rgb;
|
||
color += bloomColor; // 在 HDR 空间混合
|
||
}
|
||
|
||
// 应用曝光
|
||
if (u_EnableAutoExposure)
|
||
color *= u_Exposure;
|
||
else
|
||
color *= u_ManualExposure;
|
||
|
||
// Reinhard 色调映射
|
||
float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));
|
||
float mappedLuminance = (luminance * (1.0 + luminance / (pureWhite * pureWhite))) / (1.0 + luminance);
|
||
|
||
// 按亮度比例缩放颜色
|
||
vec3 mappedColor = (mappedLuminance / luminance) * color;
|
||
|
||
// Gamma 校正
|
||
o_Color = vec4(pow(mappedColor, vec3(1.0 / gamma)), 1.0);
|
||
} |