Вопрос по оптимизации шейдера C ++ - PullRequest
0 голосов
/ 24 ноября 2010

Может ли кто-нибудь объяснить мне довольно простые основы взаимодействия пиксельных и вершинных шейдеров.

Очевидные факты: вершинные шейдеры получают базовые свойства вершин, а затем repass некоторыеиз них в настоящий пиксельный шейдер .

Но как происходит фактический vertex->pixel переход? Я знаю, что, очевидно, все типы конвейеров включают в себя изменение растеризатора, которое способно интерполировать параметры вершин и может применять текстуры на основе определенных координат текстуры.

И, насколько я понимаюони также интерполированы (не совсем уверены в этом моменте, что-то слышали о сложной математике, производной от УФ, но я предполагаю, что мы можем сказать , что они интерполируются).


ИтакВот несколько «целевых» вопросов.

Как работает пиксельный шейдер?Я имею в виду, что пиксельный шейдер, очевидно, выполняет некоторые действия "на пиксель" , но из-за неочевидной вершины-> пиксельного перехода это вызывает некоторые вопросы.

Могу ли я предположить,что если я оцениваю матрично-векторное произведение один раз в моем пиксельном шейдере, он будет оцениваться один раз при растеризации изображения?Или было бы лучше оценить все, что возможно в моем вершинном шейдере, а затем передать его в пиксельный шейдер?

Кроме того, если бы кто-то мог указать статьи / рефераты на эту тему, я был бы очень признателен за это.

Спасибо.


ОБНОВЛЕНИЕ

Я думал, что на самом деле это не имеет значения, потому что взаимодействие должно быть почти одинаковым везде.Я разрабатываю приложения для визуализации и игры для настольных компьютеров, используя HLSL / GLSL / Nvidia CG для шейдеров и в основном C ++ в качестве базового языка.

1 Ответ

3 голосов
/ 24 ноября 2010

Вершинный шейдер выполняется один раз для каждой вершины. Это позволяет вам преобразовывать вершину из координат мирового пространства (или любой другой системы координат, в которой она может быть) в координаты пространства экрана.

То есть, если у вас есть треугольник, каждая вершина преобразуется, поэтому она заканчивается позицией на экране.

И с учетом этих позиций растеризатор определяет, какие пиксели покрыты треугольником, охватываемым этими тремя вершинами.

И затем для каждого пикселя внутри треугольника вызывается пиксельный шейдер. Выходные данные вершинного шейдера обычно интерполируются для каждого пикселя, поэтому пиксели, близкие к вершине v0, получат значения, очень близкие к значениям, вычисленным вершинным шейдером для v0.

А это значит, что все, что вы делаете в пиксельном шейдере, выполняется один раз на пиксель, покрытый растеризуемым примитивом

...