mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-17 09:16:11 +03:00
fix(OpenGL): use sRGB texture format for gamma correct interpolation
otherwise images will be too dark when scaled
This commit is contained in:
@ -70,6 +70,9 @@ pub const InternalFormat = enum(c_int) {
|
|||||||
rgb = c.GL_RGB,
|
rgb = c.GL_RGB,
|
||||||
rgba = c.GL_RGBA,
|
rgba = c.GL_RGBA,
|
||||||
|
|
||||||
|
srgb = c.GL_SRGB,
|
||||||
|
srgba = c.GL_SRGB_ALPHA,
|
||||||
|
|
||||||
// There are so many more that I haven't filled in.
|
// There are so many more that I haven't filled in.
|
||||||
_,
|
_,
|
||||||
};
|
};
|
||||||
|
@ -368,8 +368,8 @@ pub const Image = union(enum) {
|
|||||||
internal: gl.Texture.InternalFormat,
|
internal: gl.Texture.InternalFormat,
|
||||||
format: gl.Texture.Format,
|
format: gl.Texture.Format,
|
||||||
} = switch (self.*) {
|
} = switch (self.*) {
|
||||||
.pending_rgb, .replace_rgb => .{ .internal = .rgb, .format = .rgb },
|
.pending_rgb, .replace_rgb => .{ .internal = .srgb, .format = .rgb },
|
||||||
.pending_rgba, .replace_rgba => .{ .internal = .rgba, .format = .rgba },
|
.pending_rgba, .replace_rgba => .{ .internal = .srgba, .format = .rgba },
|
||||||
else => unreachable,
|
else => unreachable,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -6,7 +6,24 @@ layout(location = 0) out vec4 out_FragColor;
|
|||||||
|
|
||||||
uniform sampler2D image;
|
uniform sampler2D image;
|
||||||
|
|
||||||
|
// Converts a color from linear to sRGB gamma encoding.
|
||||||
|
vec4 unlinearize(vec4 linear) {
|
||||||
|
bvec3 cutoff = lessThan(linear.rgb, vec3(0.0031308));
|
||||||
|
vec3 higher = pow(linear.rgb, vec3(1.0/2.4)) * vec3(1.055) - vec3(0.055);
|
||||||
|
vec3 lower = linear.rgb * vec3(12.92);
|
||||||
|
|
||||||
|
return vec4(mix(higher, lower, cutoff), linear.a);
|
||||||
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
vec4 color = texture(image, tex_coord);
|
vec4 color = texture(image, tex_coord);
|
||||||
|
|
||||||
|
// Our texture is stored with an sRGB internal format,
|
||||||
|
// which means that the values are linearized when we
|
||||||
|
// sample the texture, but for now we actually want to
|
||||||
|
// output the color with gamma compression, so we do
|
||||||
|
// that.
|
||||||
|
color = unlinearize(color);
|
||||||
|
|
||||||
out_FragColor = vec4(color.rgb * color.a, color.a);
|
out_FragColor = vec4(color.rgb * color.a, color.a);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user