Результат - вместо текстур белые полигоны.
Пробовал менять местами загрузку текстур и создание вершинных буферов, тогда текстуры работают, но отображаются неправильно:
Если убрать вызов glBindTexture в функции рендеринга, то всё работает нормально. Только как тогда использовать в программе несколько текстур?
Если VBO отключить - закомментировать создание вершинных буферов и переделать функцию рендеринга следующим образом:
(массивы t_objects, n_objects и v_objects соответственно не удалять), то всё работает правильно:
Экспериментальным путём установил, что проблемы возникают при вызове glGenBuffers. Если эту функцию вызвать после загрузки текстур, то glBindTexture(GL_TEXTURE_2D, texObj); в функции рендеринга перестаёт работать (белые полигоны). Вот теперь не знаю, что делать. В чём может быть ошибка?
Ситуация напоминает такой вариант, что текстура и буфер (текстурные координаты) имеют одинаковый идентификатор.
Для начала проверь значения texObj и VBOpoints, чему они равны?
Закомментируй вызовы glGen*
Пропиши вручную
texObj = 1;
VBOpoints[0] = 2;
ну и т.п.
И скажи, что получается.
Добавлено 03-06-2009 в 21:54:
Я вообще не пользуюсь функциями вида glGen*, у меня свой менеджер идентификаторов. Советую и тебе так сделать.
А вот glDelete* - использовать обязательно (т.к. она еще и память освобождает).
Спасибо, я нашёл ошибку. У меня VBOpoints был объявлен как
C++ Source Code:
GLuint VBOpoints[2];
Видимо, я забыл поменять это число с тех пор, когда текстур ещё не было (и соответственно буфера для текстурных координат). Только неясно, почему программа не вылетала при вызове
C++ Source Code:
glBindBuffer(GL_ARRAY_BUFFER_ARB, VBOpoints[2]);
Спасибо за помощь. Вы указали в какую сторону копать