2013-11-01 5 views
0

Мне нужен способ передать массив в шейдер Вершины, который содержит несколько значений для каждой вершины. у меня есть это:Передача вершинного массива любого количества значений в GLSL 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 соседей. В общем случае у меня более четырех соседей на вершину. В текущей модели у меня есть несколько вершин с 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.


EDIT: Может быть, с помощью ВАО это не путь к NeighborsNormals. Я открыт для предложений, но мне нужно знать конкретный индекс текущей вершины, чтобы получить доступ к правильным значениям.


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

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

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

+0

* «Один массив из ВСЕХ нормалей окрестности для каждой вершины. [...]» * Могу ли я спросить, почему вы этого хотите? Это похоже на работу для геометрических шейдеров, где, если вы используете примитивный тип смежности, вы можете просто извлечь из вершинного потока во время примитивной сборки. –

+0

Мне нужно знать все нормали, чтобы использовать их в Tessellation Control Shader. Геометрический шейдер приходит после Tessellation, и это не поможет мне:/ – fern17

+1

Хорошо, поэтому важно понять, что вы не можете использовать массивы для атрибутов вершин. Если вы настаиваете на том, чтобы делать это таким образом, вы можете **, однако, сделать что-то вроде хаки - упаковать свой массив из 4 соседних 'vec3' в матрицу 4x4. Поймите, однако, что атрибут vertex 'mat4' занимает 4 слота атрибута - они не дешевые. Если вы хотите получить действительно фантазию, вы, вероятно, можете использовать последний столбец матрицы 4x4 для упаковки '5' vec3> :) –

ответ

2

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

в 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.You может считывать данные из ваших данных и формировать их как Vec3, vec4 независимо вы хотите.

+0

Спасибо за ваш ответ. Но я вижу проблему здесь. Если я использую текстуру, в VS мне нужно знать, что такое нормали для текущей вершины. Предположим, что я в вершине 108. Каждая вершина имеет максимум 10 соседей. Соседи этой вершины 6 (вершины 4, 8, 15, 16, 23, 42). Эти вершинные нормали хранятся в диапазоне: 108 * 10 до 108 * 10 + 10 текстуры. Как я могу узнать в VS текущий индекс (108)? – fern17

+0

На самом деле, я не понимаю, что вы хотите сделать. Но если вы знаете, какой нормальный относится к данным в Opengl, вы можете сопоставить текстуру с вашей вершиной в части opengl, используя функцию glTexCoord. например: glTexCoord2f (textx, texty); \t \t \t \t glVertex3f (координата, координата, 0.0f); –

+2

@ fern17: В OpenGL 3.0+ у вас есть доступ к предварительно объявленной переменной вершинного шейдера с именем 'gl_VertexID', которая делает именно то, о чем вы просите. –

 Смежные вопросы

  • Нет связанных вопросов^_^