C ++ OpenGL загрузить образ в GL_QUAD, glVertex2f - PullRequest
1 голос
/ 05 января 2011

Используя WIN32_FIND_DATA и FindFirstFile Я ищу файлы в каталоге с fileName.find(".jpg") != std::string::npos Я отфильтровываю изображения jpg.

Я использую OpenGL для создания коробок с красным цветом:

glBegin( GL_QUADS );
glColor4f( 1.0f, 0.0f, 0.0f, 0.0f );   glVertex2f( 0.35f, 0.7f );
glColor4f( 1.0f, 0.0f, 0.0f, 0.0f );   glVertex2f( -0.35f, 0.7f );
glColor4f( 1.0f, 0.0f, 0.0f, 0.0f );   glVertex2f( -0.35f, -0.3f );
glColor4f( 1.0f, 0.0f, 0.0f, 0.0f );   glVertex2f( 0.35f, -0.3f );

Это коробка в центре красного цвета.

Мой вопрос: как я могу загрузить Изображения в Кубе вместо Красного цвета (glColor4f)?

Я думаю, что это не лучший способ сделать это, но этот код не мой собственный Код, я пытаюсь сделать это лучше для друга.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 05 января 2011

Вам нужно узнать о текстурировании.См. Учебное пособие NeHe по теме в качестве примера.

Однако это учебное пособие устарело (как и ваш код, поскольку вы используете glVertex (), так что это может не иметь для вас значения).прямо сейчас... :).

В любом случае, начиная с OpenGL 3.1 и OpenGL ES 2.0, вы должны сделать это с использованием GLSL, фрагментных шейдеров и сэмплеров.Смотрите другой учебник для этого.На самом деле это проще, чем изучать все фиксированные функции.

0 голосов
/ 05 января 2011

Практически не рекомендуется использовать WinAPI вместе с приложениями OpenGL, если только у вас нет для этого причин - и загрузка текстур с диска не является хорошей причиной.

Подумайте так: OpenGL - это платформанезависимый API, зачем ослаблять это преимущество, используя непереносимые подпрограммы, когда существуют переносимые альтернативы и удобнее использовать в большинстве случаев?


Для загрузки текстур я рекомендуюбиблиотека SOIL .Вероятно, это будет гораздо лучшим решением, чем то, что рекомендуют учебные пособия NeHe.

Для поиска файлов на диске вы можете использовать boost :: filesystem если вы хотите избавиться от зависимости WinAPI.Но сейчас это не приоритет.


Если у вас есть текстура, загруженная SOIL (значение GLuint является идентификатором текстуры), вы можете сделать следующее:

  • enable2D текстурирование (glEnable(GL_TEXTURE_2D)),
  • привязка текстуры в качестве активной 2D текстуры (glBindTexture(GL_TEXTURE_2D,tex);),
  • установка активного цвета на чистый белый, чтобы изображение текстуры было полноцветным,
  • нарисуйте вершины как обычно, но для каждой вершины вам нужно будет указать текстурную координату (glTexCoord2f) вместо цвета.(0,0) - верхняя левая координата текстурного изображения, (1,1) - нижний правый.

Обратите внимание, что текстурное изображение должно иметь размеры , равные двум (например, 16x16 или 256x512).Если вы хотите использовать текстуру любого размера, переключитесь на более новую версию OpenGL, которая поддерживает GL_TEXTURE_RECTANGLE.

Не очень много объяснений, если говорить об основах.:) 1041

Кстати - +1 за то, что сказал Маркус в своем ответе.Вы изучаете устаревшую версию OpenGL прямо сейчас;в то время как вы можете делать с ним много забавных вещей, вы можете сделать больше с как минимум OpenGL 2 и шейдерами ... и с шейдерами это обычно проще.

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