Я делаю некоторые сложные вычислительные операции с сетками с помощью libiGL (c ++) и пытаюсь перенести эти вычисления в графический процессор. Для начала я пытаюсь запустить базовый фрагмент кода, но значения атрибутов, похоже, не передаются шейдерам.
int m = V.rows();//vertices
P.resize(m);
for (int i = 0; i < m; i++)
{
P(i) = i / m;
}
std::map<std::string, GLuint> attrib;
attrib.insert({ "concentration", 0 });
igl::opengl::create_shader_program(
mesh_vertex_shader_string,
mesh_fragment_shader_string,
attrib,
v.data().meshgl.shader_mesh);
GLuint prog_id = v.data().meshgl.shader_mesh;
const int num_vert = m;
GLuint vao[37 * 37];//37*37 vertices
glGenVertexArrays(m, vao);
GLuint buffer;
for (int i = 0; i < m; i++)
{
glGenBuffers(1, &buffer);
glBindVertexArray(vao[i]);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float), P.data(), GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, (void*)(i*sizeof(float)));
}
Красный цвет каждой вершины должен зависеть от ее порядка (от 0 красного до 1 красного), но вместо этого сетка окрашивается без красного вообще.
Я основываюсь на этом коде: https://github.com/libigl/libigl/issues/657 и http://www.lighthouse3d.com/cg-topics/code-samples/opengl-3-3-glsl-1-5-sample/.
Я изменил строки шейдера соответственно, добавив следующие строки:
Вершинный шейдер
in float concentration;
out float c;
c = concentration;
где последняя строка находится в main ();
Фрагмент шейдера
in float c;
outColor.x = c;
где последняя строка находится в main ().
Что я делаю не так?
Изменить: OpenGL версия используется на самом деле 3,2