Есть вот такие простые структуры поверхностей и нормалей
struct faces3vi { int v1,v2,v3; }; struct normal3f { GLfloat x; GLfloat y; GLfloat z; };
Нормаль высчитываю относительно 3-х точек из Faces.
Рисую фэйсы так:
glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, sizeof(m::vertex3f),v); glDrawElements(GL_TRIANGLES,items.facesSize()*3,GL_UNSIGNED_INT, f); glDisableClientState(GL_VERTEX_ARRAY);
Сами координаты я считываю из файла .OBJ, но нормали считаю сам. В OBJ например:
f 1/1/1 2/2/2 3/3/3
v/vt/vn - получается так.
Подскажите как отрисовывать нормали и текстуры из моей структуры?
glNormalPointer, glTexCoordPointer
nes
Тоесть по отдельности? Читаем отдельно, рисуем отдельно? Но должно быть Нормали == Faces? Или как?
Nawy
> Но должно быть Нормали == Faces? Или как?
Вообще не так.
На вход подаются атрибуты вершин. То есть для каждой вершины одинаковый набор аттрибутов:
например {координата, текстурная координата, нормаль}.
А при вызове glDrawElements или glDrawArrays говорится, что из вершин надо собирать треугольники.
И дело в том, что для OpenGL всё равно, что ему передавать в виде атрибутов. Да, существуют функции типа glNormalPointer и glTexCoordPointer, но они просто для каждой вершины составляют набор аттрибутов например вот так: {Normal, TexCoord} - получился набор из двух аттрибутов. И дают это на вход вершинному шейдеру, так что в вершинном шейдере доступна одна нормаль и одна текстурная координата.
PS
Можно вообще придумать свой аттрибут "высота" и выдавать только его в вершинный шейдер. Выйдет, что у каждой вершины есть только высота и больше ничего.
Chipmunk
Блин честно говоря шейдерами не занимался. Получается что бы что то нарисовать просто пишу вершинный шейдер? Я просто пытаюсь открыть файл OBJ и не могу придумать как его отрисовать.
Вот допустим есть файл OBJ
v 100.000000 0.000000 0.000000 v -100.000000 0.000000 0.000000 v -100.000000 100.000000 0.000000 v 100.000000 100.000000 0.000000 vt 0.5000 0.0000 0.0000 vt 0.5000 1.0000 0.0000 vt 0.7500 0.0000 0.0000 vt 0.7500 1.0000 0.0000 vn -0.0011 0.0000 -1.0000 vn -1.0000 0.0000 0.0011 vn 0.0011 0.0000 1.0000 vn 1.0000 0.0000 -0.0011 f 1/1/1 2/2/1 3/3/1 4/4/1
Нормали я пропускаю, высчитываю их сам, а остальное как нарисовать?
Я могу считать, но нарисовать не могу, нарисовать хочется именно массивом)
Nawy
рано тебе пока с шейдерами работать.
кол-во атрибутов (коими и являются текстурные координаты, нормали и позиции), как было сказано выше, должно быть одинаковым для каждой вершины.
где и как их хранить - выбирает программист, хочешь отдельно три массива, хочешь все в одном массиве.
по сути грузишь сперва данные в два или три временные массива (отдельно нормали, отдельно позиции, отдельно текстурные координаты) + массив для инфы о гранях.
далее уже из этих массивов на основе инфы из массива граней собираешь модель для отображения.
вот псевдокод для ясности:
Учти что это не идеальный код, массив вершин будет содержать дубликаты вершин, так что лучше его сперва отсортировать, но тогда и массив граней придется перестраивать.
Есть скилл в javascript?
nes
просто супер! Спасибо большое!
Тема в архиве.