GLSL shader gen: Add alpha test (...half of it I guess)

This commit is contained in:
wheremyfoodat 2024-05-13 00:51:40 +03:00
parent 798c651a17
commit 842943fa4c
7 changed files with 108 additions and 38 deletions

View file

@ -144,6 +144,8 @@ std::string FragmentGenerator::generate(const PICARegs& regs) {
compileTEV(ret, i, regs);
}
applyAlphaTest(ret, regs);
ret += "fragColor = combinerOutput;\n";
ret += "}"; // End of main function
ret += "\n\n\n\n\n\n\n\n\n\n\n\n\n";
@ -353,3 +355,25 @@ void FragmentGenerator::getAlphaOperation(std::string& shader, TexEnvConfig::Ope
break;
}
}
void FragmentGenerator::applyAlphaTest(std::string& shader, const PICARegs& regs) {
const u32 alphaConfig = regs[InternalRegs::AlphaTestConfig];
// Alpha test disabled
if (Helpers::getBit<0>(alphaConfig) == 0) {
return;
}
const auto function = static_cast<CompareFunction>(Helpers::getBits<4, 3>(alphaConfig));
shader += "if (";
switch (function) {
case CompareFunction::Never: shader += "true"; break;
case CompareFunction::Always: shader += "false"; break;
default:
Helpers::warn("Unimplemented alpha test function");
shader += "false";
break;
}
shader += ") { discard; }\n";
}