c #opengl #optimization #textures
#c #opengl #оптимизация #Текстуры
Вопрос:
У меня есть процедурное приложение для генерации ландшафта. Теперь я хочу генерировать текстуры для местности на основе высоты.
Допустим, у меня есть 5 текстур для разных уровней высоты, теперь для каждого пикселя я вычисляю его положение на сетке, затем получаю его высоту, а затем решаю, из какой текстуры делать выборку.
Обратите внимание, что текстура всегда квадратная.
В коде это будет что-то вроде:
for (int i = 0; i < resolution; i ) {
for (int j = 0; j < resolution; j ) {
tex[i * resolution* 3 j * 3 0] = SampleTextureR(i, j);
tex[i * resolution* 3 j * 3 1] = SampleTextureG(i, j);
tex[i * resolution* 3 j * 3 2] = SampleTextureB(i, j);
}
}
Теперь SampleTextureR(i, j)
это похоже на:
for(TextureData* t : txtures){
if(t.heightl > GetMeshElevation(i, j) amp;amp; t.heightg < GetMeshElevation(i, j))
return t.sampleR(i, j);
}
return 0;
GetMeshElevation
возвращает высоту сетки в точке. t.sampleR() возвращает unsigned char
значение красных пикселей текстуры в (i, j)
.
heightl
минимальная высота текстуры heightg
— максимальная высота текстуры
Теперь проблема в том, что это очень медленный метод. Как я могу сделать это достаточно быстро, чтобы это можно было сделать в режиме реального времени, чтобы изменения в heightl
or heghtg
немедленно отражались. высота и высота указаны для каждой текстуры.
Эти текстуры могут быть до 4K 4096X4096
Ответ №1:
Используйте переменную между вашим вершинным и фрагментным шейдером. Должно быть достаточно одного значения с плавающей запятой, поскольку вас интересует только координата высоты.
Кроме этого, введите 5 однородных переменных для ваших текстур в шейдере фрагментов и выполните вычисления на графическом процессоре.
Более подробно:
Для каждого фрагмента вы получаете в шейдере фрагмента интерполированное значение высоты текущей сетки. В зависимости от значения высоты вы просто выбираете образец из желаемой текстуры и выделяете этот цвет.
Комментарии:
1. На самом деле я думаю, что мне нужно обработать текстуру на стороне процессора, поскольку это не только для показа, но также должно быть запечено и сохранено в формате png или каком-либо другом формате
2. Также еще одна вещь, которую я взял 5 в качестве примера, она переменная, поэтому, если я последую вашему подходу, вы не сможете использовать более 32 текстур до предела gpu
3. @JaysmitoMukherjee То, что вы делаете «после» вычислений, не важно, мы обсуждаем, как это сделать.
GL_MAX_TEXTURE_IMAGE_UNITS
(glGetIntegerv
) указывает, сколько текстурных блоков вы можете использовать одновременно (см. khronos.org/opengl/wiki/Shader#Resource_limitations ).4. @JaysmitoMukherjee Кстати. вы также можете визуализировать текстуру, если хотите обработать изображение дальше.
5. Я думаю, я пойду со второй идеей