Как динамически связать массив из множества наборов текстурных координат для смешивания в современном OpenGL? - PullRequest
1 голос
/ 28 октября 2019

Я пытаюсь разобраться во всей системе связывания нескольких текстур, которые содержат разные значения UV-координат, особенно для мозаичного (повторяющегося) построения карты, чтобы смешать карту альбедо + нормаль, которая содержит разные скалярные значения. Динамически устанавливать несколько текстурных координат в одну сетку было бы полезно во многих сценариях - одна из них заключается в том, что детали карты нормалей действительно выделяются такими вещами, как кожа, ржавый металл и т. Д. Этого можно было бы просто достичь путем масштабирования значений координат UV до чего-то относительно высокого и оставить масштаб карты альбедо равным 1.

Как можно было бы передать эти наборы координат текстуры из C ++ в шейдер glsl, иКакой самый эффективный / динамический конвейер можно использовать для рендеринга в реальном времени?

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

Это моя структура вершин, однако я анализирую только один набор позиций вершин и один набор координат текстур:

    struct VertexElement {
     uint16_t               componentSize;
     std::vector<float>     data;

     VertexElement(uint16_t comp_size, std::vector<float> vertex_data)
     {
    componentSize = comp_size;
    data = vertex_data;
     }
    };

    struct Vertex {
     uint16_t stride;
     std::vector<VertexElement> vertexElements;

     inline Vertex() = default;
     inline Vertex(uint16_t _stride, std::vector<VertexElement> 
         _vertex_elements) 
         {
    stride = _stride;
    vertexElements = _vertex_elements;
     }
    };

По сути, я хочу объединить несколько текстур, содержащих полностьюразличные значения координат без необходимости статического размещения в GLSL следующим образом:

       location (layout = 0) in vec2 texCord0
       location (layout = 1) in vec2 texCord1        <----- BAD!!
       location (layout = 2) in vec2 texCord3
       ...

Я пробовал это, однако мне нужно динамически перенастроить размер набора texcoord для редактирования в реальном времени. Возможно ли это в OpenGL?

Спасибо.

1 Ответ

2 голосов
/ 29 октября 2019

Интерфейс между шейдерами всегда статически определен. У шейдера всегда есть входы X.

Если вы хотите, чтобы некоторая информация определялась динамически, вам придется использовать существующие инструменты (загрузка / сохранение изображений, SSBO, UBO и т. Д.), Чтобы прочитать этоинформация сама. Это вполне возможно для вершинных шейдеров, так как индекс gl_VertexID может использоваться как индекс в массиве.

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

Мне нужно перенастроить размер набора texcoord динамически для редактирования в реальном времени.

Это не совсем возможно, особенно для описанного вами варианта использования.

Рассмотрим карту нормалей. Разница между использованием карты нормалей и не использованием карты нормалей существенна. Не только в том, какие параметры вы передаете в VS, но и в фундаментальной природе вашего шейдера.

Нормальные карты обычно представляют собой касательное пространство. Так что вашему шейдеру теперь нужна полная матрица NBT. И вам, вероятно, придется передать эту матрицу в ваш фрагментный шейдер, который будет использовать ее для построения нормали из карты нормалей. Конечно, если вы не используете карту нормалей, вы просто получите нормаль для каждой вершины. Итак, вы говорите о существенных изменениях в структуре вашего кода, а не только о входных данных.

Шейдеры - это просто строки, поэтому вы можете динамически создавать их по своему усмотрению. Но это будет на много сложнее, чем то, что получает ваш VS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...