Причина, по которой он работает в любом случае, заключается в том, что константы были обработаны в Direct3D 8 / Direct3D 9. В то время для всего шейдера был только один общий массив констант (один для VS и один для PS). , Это потребовало, чтобы вам приходилось менять массив констант каждый раз, когда вы вызывали Draw
.
В Direct3D 10 константы были реорганизованы в один или несколько буферов констант, чтобы упростить обновление некоторых констант, оставляя другие в покое, и, следовательно, отправлять меньше данных в графический процессор.
См. Классическую презентацию Windows to Reality: получение максимальной отдачи от графики Direct3D 10 в ваших играх , чтобы получить множество подробностей о влиянии постоянного обновления.
Результатом этого является то, что если вы не укажете cbuffer
, все константы будут помещены в один неявный константный буфер, связанный с регистром b0
, чтобы эмулировать старое поведение «одного константного массива».
Существуют флаги компилятора для управления принятием устаревших конструкций: /Gec
для режима обратной совместимости для поддержки старых встроенных функций Direct3D 8/9 и /Ges
для обеспечения более строгой компиляции для исключения старых конструкций. Тем не менее, HLSL-компилятор будет почти всегда принимать глобальные константы без cbuffer
и помещать их в один неявный постоянный буфер, потому что этот шаблон чрезвычайно распространен в шейдерном коде.