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 байта
Когато изчисленията са прости, както в нашия пример, размерът на буфера не е критичен, но колкото по-сложни стават вашите структури, толкова по-сериозно е натоварването.
Така че оптимизирайте вашите шейдъри.
Разделяне на буфери
Шейдърите ви позволяват да използвате няколко буфера наведнъж, така че е по-добре да разделите нашия буфер на две: