Войти
ПрограммированиеФорумГрафика

Немного не понятно

#0
14:24, 1 июня 2013

Есть вот такие простые структуры поверхностей и нормалей

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 - получается так.

Подскажите как отрисовывать нормали и текстуры из моей структуры?

#1
14:59, 1 июня 2013

glNormalPointer, glTexCoordPointer

#2
15:43, 1 июня 2013

nes
Тоесть по отдельности? Читаем отдельно, рисуем отдельно? Но должно быть Нормали == Faces? Или как?

#3
17:07, 1 июня 2013

Nawy
> Но должно быть Нормали == Faces? Или как?
Вообще не так.

На вход подаются атрибуты вершин. То есть для каждой вершины одинаковый набор аттрибутов:
например {координата, текстурная координата, нормаль}.

А при вызове glDrawElements или glDrawArrays говорится, что из вершин надо собирать треугольники.

И дело в том, что для OpenGL всё равно, что ему передавать в виде атрибутов. Да, существуют функции типа glNormalPointer и glTexCoordPointer, но они просто для каждой вершины составляют набор аттрибутов например вот так: {Normal, TexCoord} - получился набор из двух аттрибутов. И дают это на вход вершинному шейдеру, так что в вершинном шейдере доступна одна нормаль и одна текстурная координата.

PS
Можно вообще придумать свой аттрибут "высота" и выдавать только его в вершинный шейдер. Выйдет, что у каждой вершины есть только высота и больше ничего.

#4
19:16, 1 июня 2013

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 

Нормали я пропускаю, высчитываю их сам, а остальное как нарисовать?
Я могу считать, но нарисовать не могу, нарисовать хочется именно массивом)

#5
19:55, 1 июня 2013

Nawy
рано тебе пока с шейдерами работать.
кол-во атрибутов (коими и являются текстурные координаты, нормали и позиции), как было сказано выше, должно быть одинаковым для каждой вершины.
где и как их хранить - выбирает программист, хочешь отдельно три массива, хочешь все в одном массиве.

по сути грузишь сперва данные в два или три временные массива (отдельно нормали, отдельно позиции, отдельно текстурные координаты) + массив для инфы о гранях.
далее уже из этих массивов на основе инфы из массива граней собираешь модель для отображения.

вот псевдокод для ясности:

+ Показать

Учти что это не идеальный код, массив вершин будет содержать дубликаты вершин, так что лучше его сперва отсортировать, но тогда и массив граней придется перестраивать.

#6
20:33, 1 июня 2013

Есть скилл в javascript?

#7
22:25, 1 июня 2013

nes
просто супер! Спасибо большое!

ПрограммированиеФорумГрафика

Тема в архиве.