Я спорю о плюсах и минусах передачи координат текстуры в шейдер GLSL различными способами.
Я рендерил много данных экземпляра.У меня есть одна базовая модель, а затем я передаю матрицу трансформации и индекс текстуры / спрайта моему шейдеру.Затем каждая модель поворачивается и переводится в соответствии с матрицей преобразования, а текстура определяется в соответствии с этим фрагментом:
TexCoord0 = vec2(TexCoord.x+(TexIndex%16),TexCoord.y+(TexIndex/16))/16;
Что мне не нравится в этом, так это то, что я жестко закодировалспрайт и размер текстуры.Я мог бы использовать униформу для передачи этой информации, но тогда у меня все еще есть ограничение, что мой спрайт не может меняться от экземпляра к экземпляру (не то, что у меня есть запланированный вариант использования для этого).Более того, для определения координат спрайта требуется немного больше вычислений на графическом процессоре.
Еще один метод, который я мог бы использовать, - указать целый Rect, который будет определять положение, ширину и высоту спрайта в пределахтекстурная карта.Тем не менее, для этого потребуется указать 4 числа (16 байт) информации, а не один байт индекса текстуры.Умножьте это на, скажем, 200 тыс. Экземпляров, и мы посмотрим около 3 МБ данных (в дополнение к другим данным).Я не знаю, считается ли это «много» в наши дни или нет.
Должен ли я сосредоточиться на упрощении вычислений в моих шейдерах GLSL или уменьшении размера моих буферов?Я слышал, что передача данных в графический процессор часто является узким местом, но повторное копирование данных в буфер будет очень редко по сравнению с количеством вершин, которые он должен отображать в каждом кадре.
Аналогично, я 'я собираюсь взять матрицу преобразования моей модели и заменить ее vec3
и vec2
для перемещения и вращения соответственно (мне нужно только 2 градуса поворота), что сократит меня с 16 поплавков до 5, и тогда я могу простоперестройте матрицу в вершинном шейдере.Опять же, это отнимает некоторую гибкость, и я не уверен в экономии средств.