#c #opengl #textures
#c #opengl #Текстуры
Вопрос:
В настоящее время я пытаюсь понять, как использовать OpenGL. Я хочу создать текстуру из байтового буфера.
По какой-то причине, когда я делаю это с glTexImage2D
помощью, это не работает (текстура получается пустой):
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGBA,
texwidth,
texheight,
0,
GL_RGBA,
GL_UNSIGNED_BYTE,
bytes
);
Когда я использую gluBuild2DMipmaps
, это работает:
gluBuild2DMipmaps(GL_TEXTURE_2D,
3,
texwidth,
texheight,
GL_RGBA,
GL_UNSIGNED_BYTE,
bytes
);
В чем разница между ними и что я делаю не так?
Комментарии:
1. Откуда вы знаете, что «это не работает»? Он отображает черную текстуру или вы получаете
GL_INVALID_OPERATION
?2. Это пустая текстура (форма равномерно окрашена).
Ответ №1:
Поскольку он «работает» с gluBuild2DMipmaps
, а не с glTexImage2D
(я полагаю, текстура черная), я бы предположил, что у вас есть текстурный фильтр на основе mipmap для текстуры (который также используется по умолчанию). Попробуйте вызвать
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //or maybe GL_NEAREST
Всегда помните, что glTexImage2D
изображение задается только для выбранного уровня mipmap (в вашем случае level 0), и если вы используете фильтр минификации на основе mipmap (константа с _MIPMAP_
именем), результаты текстурирования определяются только в том случае, если вы предоставляете изображения на все уровни mipmap (что gluBuild2DMipmaps
для вас) илигенерируйте их автоматически, используя либо
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
перед загрузкой изображения или более новой
glGenerateMipmap(GL_TEXTURE_2D);
как только он будет загружен. Для первого требуется OpenGL 1.4, а для второго, я думаю, требуется поддержка FBO, и это также не устаревший современный способ создания mip-карт. Эти два способа (особенно последний) также предпочтительнее устаревшей функциональности GLU.