glTexImage2D читает вне границ - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь прочитать данные в текстуру с помощью glTexImage2D.Кажется, что независимо от того, что я пытаюсь, первая строка текселей читается правильно, но дальнейшие строки создаются из памяти за пределами заданного std :: vector:

GLuint renderedTexture;
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);

int w = 8;
int h = 8;
std::vector<GLuint> emptyData(w*h, 0);

emptyData[0] = 0xFF<<8; //blue
emptyData[1] = 0xFF<<16; //green
emptyData[3] = 0xFF<<24; //red
emptyData[w] = 0xFF<<16; // <- should be in second row, but is not shown

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0,GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, emptyData.data());

В зависимости от размератекстуры кодаЯ уже пытался использовать вектор GLubytes, но это тоже не сработало.Я также попробовал glPixelStorei(GL_UNPACK_ALIGNMENT, 1), но это тоже не сработало.Что мне здесь не хватает?

Редактировать: Дальнейшие эксперименты показали, что минимальная ширина, предполагаемая при считывании в пикселях, составляет 128 пикселей.Поэтому, если я создаю текстуру размером 64 * 64 и хочу один пиксель при x = 10, y = 14, я должен записать в emptyData[10 + 14*128] и заранее зарезервировать соответствующий объем памяти.Кто-нибудь знает, зависит ли это от платформы или почему?

1 Ответ

0 голосов
/ 28 ноября 2018

При чтении ваших наблюдений о минимальной ширине линии вам на ум приходит режим хранения GL_UNPACK_ROW_LENGTH пикселей (см. OpenGL-Refpage ).

Позволяет вам установить размер строки, пропуская заполнение строк или другие данные между строками.Однако по умолчанию это должно быть ноль.Может быть, GL_UNPACK_ROW_LENGTH установлен где-то еще в вашем коде?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...