Внедрение альфа-теста HW в HLSL - PullRequest
1 голос
/ 28 марта 2012

В настоящее время я пытаюсь реализовать 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

...