HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > OpenGL > VBO и glGenTextures()
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
axer
Новичок

Дата регистрации: Sep 2007
Проживает: Харьков
Сообщений: 28
Возраст: 35

Рейтинг



VBO и glGenTextures()

Добрый день.
У меня возникла проблема с текстурами при использовании VBO. Я загружаю текстуру:

C++ Source Code:
1
glGenTextures(1, &texObj);
2
 
3
glBindTexture(GL_TEXTURE_2D, texObj);
4
 
5
int iWidth, iHeight, iComponents;
6
GLenum eFormat;
7
 
8
GLbyte *pBytes = gltLoadTGA("stone.tga", &iWidth, &iHeight, &iComponents, &eFormat);
9
gluBuild2DMipmaps(GL_TEXTURE_2D, iComponents, iWidth, iHeight, eFormat, GL_UNSIGNED_BYTE, pBytes);
10
delete [] pBytes;

Потом создаю буферы:
C++ Source Code:
1
glGenBuffers(3, VBOpoints);
2
 
3
glBindBuffer(GL_ARRAY_BUFFER_ARB, VBOpoints[2]);
4
glBufferData(GL_ARRAY_BUFFER_ARB, sizeof(gleVector2f) * 216000, t_objects, GL_STATIC_DRAW_ARB);
5
glTexCoordPointer(2, GL_FLOAT, 0, NULL);
6
 
7
glBindBuffer(GL_ARRAY_BUFFER_ARB, VBOpoints[1]);
8
glBufferData(GL_ARRAY_BUFFER_ARB, sizeof(gleVector3f) * 216000, n_objects, GL_STATIC_DRAW_ARB);
9
glNormalPointer(GL_FLOAT, 0, NULL);
10
 
11
glBindBuffer(GL_ARRAY_BUFFER_ARB, VBOpoints[0]);
12
glBufferData(GL_ARRAY_BUFFER_ARB, sizeof(gleVector3f) * 216000, v_objects, GL_STATIC_DRAW_ARB);
13
glVertexPointer(3, GL_FLOAT, 0, NULL);
14
 
15
delete [] n_objects;
16
delete [] v_objects;
17
delete [] t_objects;

Дальше рендеринг:
C++ Source Code:
1
glBindTexture(GL_TEXTURE_2D, texObj);
2
 
3
glBindBuffer(GL_ARRAY_BUFFER_ARB, VBOpoints[2]);
4
glTexCoordPointer(2, GL_FLOAT, 0, NULL);
5
 
6
glBindBuffer(GL_ARRAY_BUFFER_ARB, VBOpoints[1]);
7
glNormalPointer(GL_FLOAT, 0, NULL);
8
 
9
glBindBuffer(GL_ARRAY_BUFFER_ARB, VBOpoints[0]);
10
glVertexPointer(3, GL_FLOAT, 0, NULL);
11
 
12
glDrawArrays(GL_QUADS, 0, 216000);

Результат - вместо текстур белые полигоны.
Пробовал менять местами загрузку текстур и создание вершинных буферов, тогда текстуры работают, но отображаются неправильно:

Если убрать вызов glBindTexture в функции рендеринга, то всё работает нормально. Только как тогда использовать в программе несколько текстур?

Если VBO отключить - закомментировать создание вершинных буферов и переделать функцию рендеринга следующим образом:
C++ Source Code:
1
glBindTexture(GL_TEXTURE_2D, texObj);
2
 
3
//glBindBuffer(GL_ARRAY_BUFFER_ARB, VBOpoints[2]);
4
glTexCoordPointer(2, GL_FLOAT, 0, t_objects);
5
 
6
//glBindBuffer(GL_ARRAY_BUFFER_ARB, VBOpoints[1]);
7
glNormalPointer(GL_FLOAT, 0, n_objects);
8
 
9
//glBindBuffer(GL_ARRAY_BUFFER_ARB, VBOpoints[0]);
10
glVertexPointer(3, GL_FLOAT, 0, v_objects);
11
 
12
glDrawArrays(GL_QUADS, 0, 216000);

(массивы t_objects, n_objects и v_objects соответственно не удалять), то всё работает правильно:


Экспериментальным путём установил, что проблемы возникают при вызове glGenBuffers. Если эту функцию вызвать после загрузки текстур, то glBindTexture(GL_TEXTURE_2D, texObj); в функции рендеринга перестаёт работать (белые полигоны). Вот теперь не знаю, что делать. В чём может быть ошибка?

Сообщить модератору | | IP: Записан
Сообщение: 45132

Старое сообщение 03-06-2009 14:05
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34527
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Ситуация напоминает такой вариант, что текстура и буфер (текстурные координаты) имеют одинаковый идентификатор.
Для начала проверь значения texObj и VBOpoints, чему они равны?

__________________

Сообщить модератору | | IP: Записан
Сообщение: 45133

Старое сообщение 03-06-2009 14:21
-
axer
Новичок

Дата регистрации: Sep 2007
Проживает: Харьков
Сообщений: 28
Возраст: 35

Рейтинг



VBOpoints = {1, 2, 3}, texObj = 1
Добавил ещё 3 вызова glGenTextures, теперь
VBOpoints = {1, 2, 3}, texObj = 4
но ничего не изменилось.

Отредактировано axer 03-06-2009 в 14:36

Сообщить модератору | | IP: Записан
Сообщение: 45135

Старое сообщение 03-06-2009 14:31
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34527
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Закомментируй вызовы glGen*
Пропиши вручную
texObj = 1;
VBOpoints[0] = 2;
ну и т.п.
И скажи, что получается.

Добавлено 03-06-2009 в 21:54:

Я вообще не пользуюсь функциями вида glGen*, у меня свой менеджер идентификаторов. Советую и тебе так сделать.
А вот glDelete* - использовать обязательно (т.к. она еще и память освобождает).

__________________

Сообщить модератору | | IP: Записан
Сообщение: 45136

Старое сообщение 03-06-2009 14:54
-
axer
Новичок

Дата регистрации: Sep 2007
Проживает: Харьков
Сообщений: 28
Возраст: 35

Рейтинг



Спасибо, я нашёл ошибку. У меня VBOpoints был объявлен как

C++ Source Code:
GLuint VBOpoints[2];

Видимо, я забыл поменять это число с тех пор, когда текстур ещё не было (и соответственно буфера для текстурных координат). Только неясно, почему программа не вылетала при вызове
C++ Source Code:
glBindBuffer(GL_ARRAY_BUFFER_ARB, VBOpoints[2]);

Спасибо за помощь. Вы указали в какую сторону копать

Сообщить модератору | | IP: Записан
Сообщение: 45138

Старое сообщение 03-06-2009 15:13
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34527
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
axer писал:
Только неясно, почему программа не вылетала при вызове

Потому что это С++, в нем нет контроля выхода за границы массива.
Цитата:
axer писал:
Спасибо за помощь. Вы указали в какую сторону копать

Всегда пожалуйста.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 45141

Старое сообщение 03-06-2009 15:52
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 18:18. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > OpenGL > VBO и glGenTextures()
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024