Генерация текстур OpenGL

#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.