В настоящее время я пытаюсь реализовать HW Alpha Test из SM2 в HLSL.
Я знаю, что есть довольно простые методы достижения этого, т.е.
клип (alphaVal <= alphaRef? -1: 1); </p>
Однако, пробуя эти приемы, я заметил, что они отличаются от результатов, полученных в тесте HW Alpha (что подтверждается влиянием дополнительных или меньших пикселей).
Техника, которую я сейчас использую, включает в себя следующее:
float alphaVal = readFromTexture(uv).a;
float alphaRef = 0.5;
float enableLessTest = 0.0; // 1.0 (off/on)
float enableGreaterTest = 1.0;
float enableEqualTest = 0.0;
// Greater test
clip((alphaRef - alphaVal) * enableGreaterTest);
// Less test
clip((alphaVal - alphaRef) * enableLessTest);<br />
// Equal test
float equality = (alphaVal == alphaRef) ? -1 : 1
clip(equiality * enableEqualTest);
Теперь вышеприведенное демонстрирует описанные проблемы, когда пиксели на краю альфа-тестируемой области отбрасываются HW, но включаются в версию SW.
Я почти уверен, что это проблема, связанная с точностью, с которой выполняются эти вычисления. Я предполагаю, что альфа-тест в HW использует целочисленные сравнения вместо float, однако я стараюсь поддерживать этот шейдер ps_2-совместимым.
Я попытался выполнить следующую операцию над alphaVal:
alphaVal = усечение (alphaVal * 255) / 255;
без удачи.
Я также пытался использовать различные расчеты внутри функций клипа, но я не могу получить точно верные пиксели, всегда возвращаются больше или меньше пикселей.
У кого-нибудь есть идеи? Я уверен, что кто-то должен был сделать это раньше?
Я начинаю задаваться вопросом, может ли это также зависеть от аппаратного обеспечения. Кто-нибудь знает?
Спасибо
Josh