Мне нужен способ передать массив в Vertex Shader, который содержит несколько значений для каждой вершины.
У меня есть это:
Итак, структура выглядит следующим образом:
В этом примере максимальная окрестность равна 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 (старый или современный) является новым (около нескольких месяцев) для меня.
Заранее спасибо.
Я понимаю, что у вас есть некоторые данные о ваших объектах, которые вы хотите обработать в своем вершинном шейдере. Вы можете перенести свой массив в вершинный шейдер, записав свой массив в текстуру. После этого импортируйте его в свой вершинный шейдер и используйте его.
в части 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, что вы хотите.
Других решений пока нет …