DX11 Справяне с постоянни буфери, vvvv

Шейдърите комуникират с външния свят чрез постоянни буфери. Дори да не ги опишем изрично, те ще бъдат създадени скрити и ще вършат своите "тъмни" дела в тайна от нашите очи).

Пример за опростен шейдър

Пред нас е прост пример, в който, за да спестим място, декларирахме необходимите променливи една по една.

Всички променливи са имплицитно и автоматично обединени в един константен буфер. Ако написахме кода с постоянен буфер, тогава той щеше да изглежда така:

Нека да се справим със съкращения:

  • tW: получава данни от щифта за ефект „Transform In“
  • tVP и tP: получава данни от щифтовете на Renderer
  • tWVP: автоматично комбинира tW и tVP
  • Когато въвеждаме други променливи, ние добавяме щифтове към възела на нашия ефект

Обърнете специално внимание на следното:

  • tW, tVP, tTex, tP, tWVP се използват главно във вертексен шейдър
  • Останалите са в пикселния шейдър

Обърнете ПОВЕЧЕ внимание на това:

  • Шейдърът получава tVP и tP от възела Renderer и те остават непроменени, независимо дали трябва да изобразим поне един обект, поне 512
  • Останалите променливи ще бъдат актуализирани на парче.
  • Обърнете внимание, че tWVP също се актуализира по слоеве, което води до умножение на матрица

Какво се случва според описания сценарий:
На процесора се създава структура, която е равна по размер на нашия буфер (с някои разлики)

За всеки парче:

  • Структурата се актуализира в зависимост от данните, получени на входа
  • Постоянният буфер се изхвърля към графичната карта
  • Постоянният буфер е свързан с върхови и пикселни шейдъри
  • В процес на изобразяване
  • Всичко се повтаря от самото начало

Сега нека добавим малко забавна математика към нашата скучна статия. Погледнете отблизо линията:

  • Постоянният буфер се изхвърля към графичната карта

В нашия пример получихме буфер със следния размер:
64 (преобразуване) * 6 + 16 (float4) + 4 (float) = 404 байта

Сега да предположим, че трябва да изобразим 512 обекта, вместо един, следователно на графичния процесор трябва да разтоварим:
404 * 512 = 206848 байта

Когато изчисленията са прости, както в нашия пример, размерът на буфера не е критичен, но колкото по-сложни стават вашите структури, толкова по-сериозно е натоварването.

Така че оптимизирайте вашите шейдъри.

Разделяне на буфери

Шейдърите ви позволяват да използвате няколко буфера наведнъж, така че е по-добре да разделите нашия буфер на две: