Загрузка текстуры OpenGL

Вечер каждый, Я собираюсь по кругу здесь, но я думаю, что ищу не в тех местах.

Мой вопрос в том, как я могу загрузить изображение и применить его к примату в openGL. Например, загрузите BMP или JPG и примените их к glutsolidsphere.

Будет ли решение ограничено одной платформой или может ли оно работать на всех?

Спасибо за помощь

Ответы

Ответ 1

Ну, если хотите, вы можете написать свой собственный загрузчик bmp. Здесь - спецификация и некоторый код. В противном случае у меня есть загрузчик tga здесь. Как только вы это сделаете, он вернет данные в массив символов без знака, иначе известный как GL_UNSIGNED_BYTE.

Чтобы создать текстуру OpenGL из этого массива, вы сначала определяете переменную, которая будет служить ссылкой на эту текстуру в памяти OpenGL.

GLuint textureid;

Затем вам нужно сообщить OpenGL, чтобы освободить место для новой текстуры:

glGenTextures(1, &textureid);

Затем вам необходимо привязать эту текстуру к используемой в данный момент текстуре.

glBindTexture(GL_TEXTURE_2D, textureid);

Наконец, вам нужно указать OpenGL, где данные для текущей текстуры.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, your_data);

Затем, когда вы создаете примитив, вы применяете его к примитиву, снова вызывая glBindTexture:


glBindTexture(GL_TEXTURE_2D, textureid);
glBegin(GL_QUAD);
     glTexCoord2f(0.0, 0.0);
     glVertex3f(0.0, 0.0, 0.0);
     glTexCoord2f(1.0, 0.0);
     glVertex3f(1.0, 0.0, 0.0);
     glTexCoord2f(1.0, 1.0);
     glVertex3f(1.0, 1.0, 0.0);
     glTexCoord2f(0.0, 1.0);
     glVertex3f(0.0, 1.0, 0.0);
glEnd();

Однако, когда вы применяете текстуру к примитиву, вам нужно иметь данные координат текстуры вместе с данными вершин, а glutSolidSphere не генерирует данные координат текстуры. Чтобы текстурировать сферу, либо сгенерируйте ее самостоятельно, либо вызовите функции texgen, либо используйте шейдеры.

Ответ 2

Существует бесконечное количество способов текстуры, отображающих изображение на сферу. Вы можете посмотреть команды gltexgen, чтобы автоматически генерировать координаты текстуры для сферы перенасыщения.

Ответ 3

Это может быть сложнее, чем вы ожидали.

Прежде всего, я уверен, что вы не можете текстурировать сферу, нарисованную с помощью glutSolidSphere, поскольку эта функция не задает координаты текстуры для вершин, которые она рисует. Поэтому вам нужно закодировать метод для рисования сферы либо вершиной по вершине, либо с помощью вершинного буфера, и обязательно укажите координаты текстуры для каждой вершины.

Как только это будет сделано, вам необходимо загрузить изображения. OpenGL не предоставляет функции для загрузки изображений из файлов, и, если я хорошо помню, глю и избыток тоже. Поэтому вам придется либо прочитать файл изображения самостоятельно, либо использовать библиотеку, которая делает это. DevIL является одним из них.

Как только у вас есть пиксельные данные изображения, вам нужно создать новую текстуру OpenGL, используя ее. Некоторые библиотеки загрузки изображений могут сделать это для вас. DevIL может.

Я очень рекомендую googling для некоторых уроков, но, пожалуйста, не используйте учебники NeHe, их качество, как правило, довольно плохое.

Ответ 4

Нед описал это красиво. Вы должны прочитать учебное пособие из NeHe, где каждый шаг подробно описан. Как отмечали другие, квадрат текстурирования будет хорошим началом, и сфера может быть немного сложной.

Ответ 5

Что смешно, TGA были первым типом файла изображения, который я смог успешно загрузить в текстуру. К сожалению, OpenGL не имеет собственных встроенных функций API для непосредственного чтения файлов. Поэтому потребуются любые внешние библиотеки или код. Формат TGA прост, и Ned предоставил ему хороший код.