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

Вопросы по функциям glEnableVertexAttribArrayARB, glVertexAttribPointerARB, glDrawElements

Страницы: 1 2 Следующая »
#0
14:38, 27 апр. 2016

Из исходных данных: Есть массив в котором лежат координаты вершин, нормалей и текстур. Он загружается в память GPU.
Отрисовывается вот так:

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, comID);
glVertexPointer(3, GL_FLOAT, 8 * sizeof(float), (const void*)0);
glNormalPointer(GL_FLOAT, 8 * sizeof(float), (const void*)(3 * sizeof(float)));
glTexCoordPointer(2, GL_FLOAT, 8 * sizeof(float), (const void*)(6 * sizeof(float)));
glDrawArrays(GL_TRIANGLES, 0, 3 * f_c);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);

Хотел попробовать иначе сделать. Воспользоваться функциями glDrawElements и glVertexAttribPointerARB.
Но возникло несколько вопросов. Поскольку оживить что-либо не получилось.

Строго не судите, только недавно начал влезать в 3D, перечитал много источников, в голове каша.

1. Функция glDrawElements работает только с индексным массивом? То есть просто вместо glDrawArrays её не используешь? Если возможно, то как?
2. Функция glVertexAttribPointerARB. Можно ли её использовать вместо glVertexPointer, glNormalPointer и т.д. или они должны работать вместе?
    Эта функция работает только в связке с шейдерами?
3. Первый параметр функции glVertexAttribPointerARB (index - specifies the index of the generic vertex attribute to be modified).
    Можно подробнее, что это за индекс атрибута вершины? Можно ли в него внести GL_VERTEX_ARRAY или GL_NORMAL_ARRAY? Или он значит что-то другое?
4. Если использовать функцию glVertexAttribPointerARB, то как должен выглядеть кусок в отрисовке?
5. До или после glVertexAttribPointerARB должна находиться функция glEnableVertexAttribArrayARB? И в аргументе можно ли ставить GL_VERTEX_ARRAY?

Пробовал вот так:

glBindBuffer(GL_ARRAY_BUFFER, comID);
glEnableVertexAttribArrayARB(GL_VERTEX_ARRAY);
glVertexAttribPointerARB(GL_VERTEX_ARRAY, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (const void*)0);
glDrawArrays(GL_TRIANGLES, 0, 3 * f_c);
glDisableVertexAttribArrayARB(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);


#1
15:24, 27 апр. 2016

Vladislaviii
> 1. Функция glDrawElements работает только с индексным массивом? То есть просто
> вместо glDrawArrays её не используешь? Если возможно, то как?
glDrawElements для отрисовки индексированной геометрии (с индексным массивом), а glDrawArrays для неиндексированной (без массива индексов). Выбираешь в зависимости от того, что нужно. Обе функции актуальны вплоть до последней версии OpenGL 4.5 и работают в связке с чем угодно.

Vladislaviii
> 2. Функция glVertexAttribPointerARB. Можно ли её использовать вместо
> glVertexPointer, glNormalPointer и т.д. или они должны работать вместе?
glVertexPointer и glNormalPointer устарели. Сейчас актуальна только glVertexAttribPointer. Суффикс ARB не нужен, эту функцию уже и так давно включили в ядро OpenGL.

Vladislaviii
> 3. Первый параметр функции glVertexAttribPointerARB (index - specifies the
> index of the generic vertex attribute to be modified).
Это номер атрибута, который привязывается к вершинному шейдеру. То есть в шейдере ты пишешь

attribute vec3 position; //Но в GL3+ attribute устарел и вместо него надо писать слово in. Но суть не в этом
Потом после компиляции шейдера и линковки программы запрашиваешь номер через glGetAttribLocation(shaderProgram, "position"). То что вернула эта функция, нужно передавать в качестве первого параметра glVertexAttribPointer и как параметр glEnableVertexAttribArray.
#2
16:04, 27 апр. 2016

Значит glVertexAttribPointer работает только в связке с шейдером?

#3
18:39, 27 апр. 2016

Vladislaviii
> Значит glVertexAttribPointer работает только в связке с шейдером?
да

#4
18:43, 27 апр. 2016

Vladislaviii
> Значит glVertexAttribPointer работает только в связке с шейдером?
В теории да. Но практически иногда может работать и без него, так как позиция в некоторых драйверах является нулевым атрибутом. Но на такое полагаться нельзя. Это я просто пишу, чтобы ты не удивлялся, если вдруг без шейдера заработает.
В общем, забудь уже про этот фиксированный конвейер и переходи полностью на шейдеры.

#5
8:06, 28 апр. 2016

Да, принял к обработке) Буду пока читать матчасть по шейдерам.

Прошло более 3 лет
#6
(Правка: 18:14) 18:13, 16 авг. 2019

Гм... Если glVertexAttribPointer (ARB) работает только в связке с шейдером то как быть если шейдеры не используются? У меня сейчас баг, геометри рисуются, но вот с текстурами беда. В коде используется VAO и вот эта функция.
Что нужно использовать вместо нее?

з.ы.
Сори что поднял старую тему.

#7
12:51, 17 авг. 2019

nen777w
> то как быть если шейдеры не используются?

Использовать glVertexPointer, glNormalPointer и др. - дошейдерные варианты (fixed pipeline).
Но в наше время использовать дошейдерные вещи - моветон. Исключительно на первое обучающее время может только представлять интерес до реальной работы.

#8
13:39, 17 авг. 2019

=A=L=X=
> Но в наше время использовать дошейдерные вещи - моветон. Исключительно на
> первое обучающее время может только представлять интерес до реальной работы.

ну сейчас не, а я для коммерчесого решения использовал лет 8 назад :)

#9
17:45, 17 авг. 2019

innuendo
Что ты делал в 2011?

#10
17:50, 17 авг. 2019

lookid
https://www.youtube.com/watch?v=JZTpd8NOpM8
порт под макаку:)

#11
6:51, 18 авг. 2019

innuendo сколько дней портировал ? И много переделать пришлось ?

#12
7:40, 18 авг. 2019

Ziltop
год, много

#13
9:27, 18 авг. 2019

innuendo
> порт под макаку:)

Круто!

innuendo
> использовал лет 8 назад

Ну лет 8 назад это довольно много, тогда только GL 3.0 года два как вышел, т.е. даже его доступность была под сомнением.

#14
(Правка: 10:20) 9:50, 18 авг. 2019

=A=L=X=
> тогда только GL 3.0 года два как вышел, т.е. даже его доступность была под
> сомнением.

ну да, особливо под интел

=A=L=X=
> Круто!

ничего крутого - полная Ж:)

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика