Для чего конкретно используется константный буфер (cbuffer) в hlsl? - PullRequest
0 голосов
/ 05 июля 2018

В настоящее время у меня есть этот код в моем классе вершинных шейдеров:

cbuffer MatrixBuffer {
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix; };

Я не знаю, почему мне нужно обернуть эти переменные в cbuffer. Если я удаляю буфер, мой код работает хорошо. Я был бы очень признателен, если бы кто-нибудь мог дать мне краткое объяснение, почему использование cbuffers необходимо.

1 Ответ

0 голосов
/ 05 июля 2018

Причина, по которой он работает в любом случае, заключается в том, что константы были обработаны в Direct3D 8 / Direct3D 9. В то время для всего шейдера был только один общий массив констант (один для VS и один для PS). , Это потребовало, чтобы вам приходилось менять массив констант каждый раз, когда вы вызывали Draw.

В Direct3D 10 константы были реорганизованы в один или несколько буферов констант, чтобы упростить обновление некоторых констант, оставляя другие в покое, и, следовательно, отправлять меньше данных в графический процессор.

См. Классическую презентацию Windows to Reality: получение максимальной отдачи от графики Direct3D 10 в ваших играх , чтобы получить множество подробностей о влиянии постоянного обновления.

Результатом этого является то, что если вы не укажете cbuffer, все константы будут помещены в один неявный константный буфер, связанный с регистром b0, чтобы эмулировать старое поведение «одного константного массива».

Существуют флаги компилятора для управления принятием устаревших конструкций: /Gec для режима обратной совместимости для поддержки старых встроенных функций Direct3D 8/9 и /Ges для обеспечения более строгой компиляции для исключения старых конструкций. Тем не менее, HLSL-компилятор будет почти всегда принимать глобальные константы без cbuffer и помещать их в один неявный постоянный буфер, потому что этот шаблон чрезвычайно распространен в шейдерном коде.

...