glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->x, texture->y, 0, GL_RED, GL_UNSIGNED_BYTE, reinterpret_cast<void*>(full_texture));
Это технически допустимо, но никогда хорошая идея.
Во-первых, вам необходимо понять, что является третьим параметром glTexImage2D
.Это фактический формат изображения текстуры.Вы не создаете текстуру с одним каналом;вы создаете текстуру с четырьмя каналами.
Далее вам нужно понять, что делают последние три параметра.Это параметры передачи пикселей ;они описывают, как выглядят данные пикселей, которые вы передаете в OpenGL.
Эта команда говорит: «создайте 4-канальную текстуру, а затем загрузите некоторые данные в просто красный канал.данные хранятся в виде массива байтов без знака. "Загрузка данных только в некоторые каналов текстуры технически законна, но почти никогда не является хорошей идеей.Если вы создаете одноканальную текстуру, вы должны использовать одноканальную текстуру .А это означает правильный формат изображения.
Далее все становится более запутанным:
new_texture->datasize = texture_width * texture_height*4;
Использование «* 4» настоятельно рекомендует вам создавать четырехканальные пиксельные данные.Но вы загружаете только одноканальные данные.Остальные ваши вычисления согласны с этим;Вы, кажется, никогда не заполняете какой-либо проход данных full_texture[texture_width * texture_height]
.Таким образом, вы, вероятно, выделяете больше памяти, чем вам нужно.
И последнее: всегда используйте внутренние форматы размера.Никогда не используйте GL_RGBA
;используйте GL_RGBA8
или GL_RGBA4
или что угодно.Не позволяйте водителю выбирать и надеяться, что он вам подойдет.
Итак, правильная загрузка будет такой:
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, texture->x, texture->y, 0, GL_RED, GL_UNSIGNED_BYTE, full_texture);
К вашему сведению: reinterpret_cast
не нужно;даже в C ++ указатели могут быть неявно преобразованы в void*
.