Предположим, компания внедрила новый шейдер в свое приложение и хочет затруднить его кражу. Однако шейдеры OpenGL отправляются на графический процессор в виде открытого текста, и Vulkan принимает легко декомпилируемый байт-код. Есть ли у какого-либо графического API ненулевой уровень запутывания шейдеров?
Реализует ли какой-либо графический API запутывание шейдеров?
Ответы (1)
Есть ли у какого-либо графического API ненулевой уровень запутывания шейдеров?
Нет. И это не имело бы никакого смысла. Шейдеры не так сложны, как полноценные приложения. Существуют довольно жесткие ограничения на сложность шейдера, чтобы обеспечить интерактивность. И любой уровень обфускации, глубоко внутри, — это просто странный набор инструкций, который можно легко деобфускировать с помощью оптимизирующего компилятора/транспилятора.
Общее правило таково: если его можно выполнить и получить читаемый результат*, его можно деобфусцировать. Это так просто.
Также опытный графический хакер сможет посмотреть на окончательный рендеринг и/или промежуточные результаты (которые легко получить с помощью таких инструментов, как renderdoc) и понять суть того, что делает шейдер только из этого. Черт возьми, 90% графического кодирования состоит из такого рода визуальной отладки вывода, когда вы пытаетесь выяснить, почему и как ваш шейдер не соответствует вашим ожиданиям, и как вообще появился тот беспорядок, который вы видите на экране. Таким образом, любой опытный графический хакер уже накопил большую часть набора навыков, необходимых для обратного проектирования шейдера, просто «взглянув» на него.
* если бы не ограничение «читаемого результата», тогда гомоморфное шифрование могло бы допускать истинное обфускация кода. Но обычно вам нужен вывод шейдера, читаемый человеком.