Skip to content

Instantly share code, notes, and snippets.

@ITotalJustice
Last active October 10, 2023 21:04
Show Gist options
  • Save ITotalJustice/13d61d700205e5a695b77a4db08b9c84 to your computer and use it in GitHub Desktop.
Save ITotalJustice/13d61d700205e5a695b77a4db08b9c84 to your computer and use it in GitHub Desktop.
// SOURCE: https://github.com/nba-emu/NanoBoyAdvance/blob/master/src/platform/core/src/device/shader/color_agb.glsl.hpp
// GODBOLT: https://godbolt.org/z/1cfaedavK
#include <cstdint>
#include <cmath>
#include <algorithm>
uint32_t gba_shader(uint16_t bgr555) {
constexpr auto darken_screen = 1.0;
constexpr auto target_gamma = 2.2;
constexpr auto display_gamma = 2.2;
constexpr auto lum = 0.94;
constexpr auto rr = 0.82;
constexpr auto rg = 0.125;
constexpr auto rb = 0.195;
constexpr auto gr = 0.24;
constexpr auto gg = 0.665;
constexpr auto gb = 0.075;
constexpr auto br = -0.06;
constexpr auto bg = 0.21;
constexpr auto bb = 0.73;
const auto R = (bgr555 >> 0) & 31;
const auto G = (bgr555 >> 5) & 31;
const auto B = (bgr555 >> 10) & 31;
const auto lr1 = std::pow(R / 31.0, target_gamma + darken_screen);
const auto lg1 = std::pow(G / 31.0, target_gamma + darken_screen);
const auto lb1 = std::pow(B / 31.0, target_gamma + darken_screen);
// apply lum and clamp
const auto lr2 = std::clamp(lr1 * lum, 0.0, 1.0);
const auto lg2 = std::clamp(lg1 * lum, 0.0, 1.0);
const auto lb2 = std::clamp(lb1 * lum, 0.0, 1.0);
// colour
const auto lr3 = std::pow(rr * lr2 + gr * lg2 + br * lb2, 1.0 / display_gamma);
const auto lg3 = std::pow(rg * lr2 + gg * lg2 + bg * lb2, 1.0 / display_gamma);
const auto lb3 = std::pow(rb * lr2 + gb * lg2 + bb * lb2, 1.0 / display_gamma);
const uint8_t rout = lr3 * 255;
const uint8_t gout = lg3 * 255;
const uint8_t bout = lb3 * 255;
return (rout << 24) | (gout << 16) | (bout << 8);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment