Координаты текстур и оптимизирующие шейдеры GLSL - PullRequest
0 голосов
/ 14 февраля 2012

Я спорю о плюсах и минусах передачи координат текстуры в шейдер GLSL различными способами.

Я рендерил много данных экземпляра.У меня есть одна базовая модель, а затем я передаю матрицу трансформации и индекс текстуры / спрайта моему шейдеру.Затем каждая модель поворачивается и переводится в соответствии с матрицей преобразования, а текстура определяется в соответствии с этим фрагментом:

TexCoord0 = vec2(TexCoord.x+(TexIndex%16),TexCoord.y+(TexIndex/16))/16;

Что мне не нравится в этом, так это то, что я жестко закодировалспрайт и размер текстуры.Я мог бы использовать униформу для передачи этой информации, но тогда у меня все еще есть ограничение, что мой спрайт не может меняться от экземпляра к экземпляру (не то, что у меня есть запланированный вариант использования для этого).Более того, для определения координат спрайта требуется немного больше вычислений на графическом процессоре.

Еще один метод, который я мог бы использовать, - указать целый Rect, который будет определять положение, ширину и высоту спрайта в пределахтекстурная карта.Тем не менее, для этого потребуется указать 4 числа (16 байт) информации, а не один байт индекса текстуры.Умножьте это на, скажем, 200 тыс. Экземпляров, и мы посмотрим около 3 МБ данных (в дополнение к другим данным).Я не знаю, считается ли это «много» в наши дни или нет.

Должен ли я сосредоточиться на упрощении вычислений в моих шейдерах GLSL или уменьшении размера моих буферов?Я слышал, что передача данных в графический процессор часто является узким местом, но повторное копирование данных в буфер будет очень редко по сравнению с количеством вершин, которые он должен отображать в каждом кадре.


Аналогично, я 'я собираюсь взять матрицу преобразования моей модели и заменить ее vec3 и vec2 для перемещения и вращения соответственно (мне нужно только 2 градуса поворота), что сократит меня с 16 поплавков до 5, и тогда я могу простоперестройте матрицу в вершинном шейдере.Опять же, это отнимает некоторую гибкость, и я не уверен в экономии средств.

1 Ответ

0 голосов
/ 14 февраля 2012

Я попытался сделать это по-другому, указав текстуру прямоугольника, а не байтовый индекс, и это на самом деле привело к огромному увеличению скорости (с 520 FPS до 3600 FPS или с 1,92 мс / кадр до 0,27 мс / кадр).*

Кажется, что сокращение вычислений важнее, по крайней мере, для моего графического процессора (серия Radeon HD 5700).Или, может быть, это просто модуль, который стоит дорого, не уверен.Я довольно доволен результатами, хотя;Я получаю больше гибкости по более низкой цене!

...