Я создал прическу в Blender 2.66, используя систему частиц волос. Это выглядит так:
Как видите, яркость была применена к фрагментам линий. После преобразования я экспортировал свою сетку прически в формат файла OBJ. Я проанализировал это в своей программе, и рендер выглядит так:
Частицы были нарисованы как GL_LINES (в моем файле OBJ у меня есть 2 вершины на грань).
В другой тестовой программе я хотел проверить светимость с помощью простого фрагмента линии. Вот мои буферы вершин:
static GLfloat vertices[6] =
{
0.000000f, 0.000000f, -2.000000f,
0.000000f, 0.000000f, 2.000000f
};
static GLfloat normals[6] =
{
0.000000f, 1.000000f, 0.000000f,
0.000000f, 1.000000f, 0.000000f
};
static GLfloat colors[6] =
{
0.000000f, 0.000000f, 1.000000f,
0.000000f, 0.000000f, 1.000000f
};
И результат (линия вращается в начале координат перпендикулярно оси X -> я назвал glLineWidth (5.0f), чтобы получить лучший видимый результат):
С помощью анимации в реальном времени я мог видеть, что яркость правильная, но только на определенной стороне линии. Это нормально, потому что линейный сегмент должен иметь бесконечное количество нормалей, а у меня всего две нормали (по одной на вершину). Я хочу уточнить, что эти две нормали являются нормалью к плоскости уравнения Y = 0 -> n (0.0, 1.0, 0.0). Поэтому мне интересно, можно ли добавить несколько нормалей на вершину? Я считаю, что OpengL не может этого сделать. Но, может быть, возможен и другой способ. Вот рисунок, который объясняет, что я хочу сделать, чтобы вычислить правильную яркость для каждой части отрезка линии:
Как вы можете видеть выше на первом изображении, Blender может вычислять яркость в реальном времени на отрезке линии. Кроме того, на этом изображении присутствует рендер OpenGL. Так что я уверен, что это возможно. Я пробовал повторить те же координаты сегмента линии два раза, но для второй строки я применяю противоположный нормальный n2 (0,0, -1,0, 0,0), но это не работает. «Другая сторона» - «темная». То же самое и с двумя полигонами. В настоящее время я использую шейдер GLSL. Я думаю, что это возможно с использованием специальных шейдеров, таких как шейдер геометрии или шейдер тесселяции. Возможно, потребуется язык CUDA. Но я не уверен.
Кто-нибудь может мне помочь?