Проблема глубока и связана с буфером глубины. Вы можете установить альфа на ноль в коде шейдера, но вы все равно будете выводить фрагмент глубины, так что это лишь частичный обходной путь, в зависимости от причины использования альфа-теста. Таким образом, вы можете сместить альфа и масштабировать на большое число (чтобы избежать ответвления шейдера), а затем зажать, и вы получите четкое очерченное ребро альфа-теста, но прозрачные пиксели все равно будут заполнять zbuffer, что, если вы и используете эту причину, до сих пор не лучше. Вы не можете обойти основную проблему в шейдере. Вы можете настроить свой контент, чтобы свести к минимуму это и, возможно, нарисовать непрозрачный непроверенный z и сделать альфа-тестирование прозрачности последним. Детали того, как это влияет на z, могут очень сильно зависеть от платформы к платформе. На некоторых платформах оптимизации zbuffer, такие как ранние z и грубые z, могут быть отключены навсегда до следующей очистки, поэтому при задержке альфа-теста вы можете повысить производительность, но на самом деле все зависит от деталей реализации.
Отрегулируйте рисунок так, чтобы минимизировать прозрачные фрагменты, и используйте альфа-тест как можно позже при рендеринге, если этого нельзя избежать.
Также, если у вас есть функция сброса, используйте ее в конце вашего шейдера против постоянного альфа-теста, это может быть нелогично, но некоторые реализации оптимизируют этот сброс альфа-теста для использования оборудования с фиксированной функцией, которое лучше, чем ветвь шейдера ( на некоторых платформах). Опять же, это действительно зависит от того, насколько сложным является управление потоком потоков графического процессора. Будущие платформы с эффективным ветвлением, вероятно, выиграют от этого раньше, в основном вы пытаетесь найти способ использовать скрытые оптимизации реализации, которые различаются для разных платформ и будут меняться в будущем.