Такая ошибка возникла потому что большая текстура не может быстро создаться в памяти видео карты.
Метод glTexImage2D копирует данные из обычной памяти в память видео карты.
Копирование работает в процессе видео карты.
Нужно ждать
Решение: нужно вызвать glGetError не сразу, а через какое то время.
Я вызываю метод:
C++
WaitOpenGlStatus(GL_NO_ERROR, 5);
Этот метод ждет хороший статус с ограничением по времени 5 секунд (ограничение времени надо потому что, если будем ждать бесконечно то зависнет программа)
C++
#include <unistd.h>
...
bool WaitOpenGlStatus(int goodOpenGlStatus, int waitSeonds)
{
timespec timeNow1;
clock_gettime(CLOCK_MONOTONIC, &timeNow1);
while (true)
{
if (glGetError()==goodOpenGlStatus)
return true;
sleep(1); // sleep 1 second
timespec timeNow2;
clock_gettime(CLOCK_MONOTONIC, &timeNow2);
if ((timeNow2.tv_sec- timeNow1.tv_sec)>waitSeonds)
return false;
};
}
C++
Файл texture_buffer_shader.cpp
...
glTexImage2D(GL_TEXTURE_2D, 0, imgFormat, width, height, 0, imgFormat, GL_UNSIGNED_BYTE, pColorData);
if (WaitOpenGlStatus(GL_NO_ERROR, 5 /*seconds to finish wait*/))
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);
}
...