Загрузка текстур OpenGL - PullRequest
       9

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

14 голосов
/ 10 января 2010

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

Мой вопрос: как мне загрузить загрузку изображения и применить его к примитиву в openGL? Например, загрузив bmp или jpg и применив его к глютсолидосфере.

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

Спасибо за вашу помощь

Ответы [ 5 ]

20 голосов
/ 13 января 2010

Ну, если вы хотите, вы можете написать свой собственный загрузчик 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 голосов
/ 12 января 2010

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

1 голос
/ 16 января 2010

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

1 голос
/ 13 января 2010

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

1 голос
/ 10 января 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...