Передача Vertex Array любого количества значений в GLSL Vertex Shader

Мне нужен способ передать массив в Vertex Shader, который содержит несколько значений для каждой вершины.
У меня есть это:

  • Один массив 3d очков
  • Один массив 3d нормалей для каждой точки
  • Один массив граней (все треугольники)
  • Один массив ВСЕХ нормалей окрестности для каждой вершины. Если у вершины i есть 4 соседа, этот массив имеет 4 3d нормали для вершины (нормали каждого из 4 соседей). Для простоты я создал этот массив так, как будто все вершины имеют одинаковое количество соседей (максимум из модели, 4 в следующем примере).

Итак, структура выглядит следующим образом:

  • массив точек = v0 v1 v2 v3 v4 …
  • массив нормалей = n0 n1 n2 n3 n4 …
  • массив граней = [0 1 2] [0 3 1] [0 4 3] …
  • массив нормалей окрестности = [n1 n2 n3 n4] [n0 n2 n3 0] [n0 n1 0 0] [n0 n1 n4 0] [n0 n4 0 0] [n0 n3 0 0] …

В этом примере максимальная окрестность равна 4, поэтому я заполняю все нормальные данные 0-векторами (0,0, 0,0, 0,0) для тех, у кого нет 4 соседей. В общем случае у меня более 4 соседей на вершину. В текущей модели у меня есть вершина с 14 соседями, поэтому мне нужно 14 нормалей или 42 числа с плавающей точкой для каждой вершины).

В шапке VS у меня есть:

layout (location = 0) in vec3 in_Position;
layout (location = 1) in vec3 in_Normal;
layout (location = 2) in XXX in_NeighborsNormals

Но я не знаю, что использовать в XXX, чтобы сказать шейдеру, что данные — это не vec3, vec4, mat4 и т. Д., А массив (известного во время компиляции размера) vec3.


РЕДАКТИРОВАТЬ:
Может быть, использование VAO — это не путь к нормальным соседям. Я открыт для предложений, но мне нужно знать конкретный индекс текущей вершины, чтобы получить доступ к правильным значениям.


Целью этого является вычисление кривизны области вокруг вершины для тесселяции с использованием шейдеров тесселяции. В частности, я ищу, чтобы повторить эту работу: http://perso.telecom-paristech.fr/~boubek/papers/VDTess/

Я использую C ++ и OpenGL 4.0, но я могу перейти на OpenGL 4.3. Я пришел из промежуточных знаний OpenGL 2.0, но GLSL (старый или современный) является новым (около нескольких месяцев) для меня.

Заранее спасибо.

0

Решение

Я понимаю, что у вас есть некоторые данные о ваших объектах, которые вы хотите обработать в своем вершинном шейдере. Вы можете перенести свой массив в вершинный шейдер, записав свой массив в текстуру. После этого импортируйте его в свой вершинный шейдер и используйте его.

в части Opengl:

    GLuint myarray // Load your texture to this variable
glEnable(GL_TEXTURE_2D);
glUniform1i(glGetUniformLocation(YOURSHADERID, "MYARRAY"), 0);
glBindTexture(GL_TEXTURE_2D, myarray); //you can change the first parameter depends what type of texture you prefer.

в Vertex Shader:

    uniform sampler2D MYARRAY; // you can use sampler1D also if you upload a 1D texture

После этого вы можете получить доступ к своим данным из MYARRAY. Вы можете прочитать их и сформировать их как vec3, vec4, что вы хотите.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]