Загрузка текстуры 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 предоставил ему хороший код.