Вечер все, я брожу вокруг в кругах здесь, но я думаю, что смотрю в неправильных местах.
Мой вопрос состоит в том, как я пошел бы о загрузке изображения и применении его к примитиву в openGL. Например, загружая bmp или jpg и применяя его к glutsolidsphere.
Решение было бы ограничено одной платформой, или это могло работать через все?
Спасибо за помощь.
Это может быть сложнее, чем вы ожидаете.
Прежде всего, я совершенно уверен, что вы не можете текстурировать сферу, нарисованную с помощью glutSolidSphere
, поскольку эта функция не определяет координаты текстуры для вершин, которые она рисует. Поэтому вам нужно закодировать метод рисования сферы либо вершина за вершиной, либо с использованием буфера вершин, и обязательно укажите координаты текстуры для каждой вершины.
Как только это будет сделано, вам нужно загрузить изображения. OpenGL не предоставляет функций для загрузки изображений из файлов, и, если я хорошо помню, у glu и glut тоже нет. Поэтому вам придется либо прочитать файл изображения самостоятельно, либо использовать библиотеку, которая это делает. DevIL - один из них.
Когда у вас есть пиксельные данные изображения, вам нужно создать новую текстуру OpenGL, используя их. Некоторые библиотеки загрузки изображений могут сделать это за вас. Дьявол может.
Я настоятельно рекомендую поискать в Google некоторые обучающие программы, но, пожалуйста, не используйте обучающие программы NeHe, их качество, как правило, довольно низкое.
Ну, если вы хотите, вы можете написать свой собственный 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 или используют шейдеры.
Существует бесконечное количество способов текстурирования изображения на сферу. Вы можете посмотреть в команды gltexgen, чтобы автоматически сгенерировать текстурные координаты для glut сферы.
NED описал это красиво. Вы должны прочитать учебник из NEHE , где каждый шаг подробно описан. Как указали другие, текстурирование Quad было бы хорошим началом и сферой может быть немного сложно.
Это смешно, TGAS были первым типом файла изображения, который я смог успешно загрузить в текстуру. К сожалению, OpenGL не имеет собственного встроенного функций API для чтения файлов напрямую. Таким образом, любые внешние библиотеки или код потребуются. Формат TGA проста, и NED предоставил для него какой-то хороший код.