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

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

Мой вопрос состоит в том, как я пошел бы о загрузке изображения и применении его к примитиву в openGL. Например, загружая bmp или jpg и применяя его к glutsolidsphere.

Решение было бы ограничено одной платформой, или это могло работать через все?

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

14
задан John Roer 10 January 2010 в 02:48
поделиться

5 ответов

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

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

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

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

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

1
ответ дан 1 December 2019 в 12:01
поделиться

Ну, если вы хотите, вы можете написать свой собственный 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);

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


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 или используют шейдеры.

20
ответ дан 1 December 2019 в 12:01
поделиться

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

2
ответ дан 1 December 2019 в 12:01
поделиться

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

1
ответ дан 1 December 2019 в 12:01
поделиться

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

1
ответ дан 1 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: