Генерировать высококачественные текстуры в реальном времени C

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. Я думаю, я пойду со второй идеей