Граница вокруг текстуры, OpenGL

Это код, который я использую для рисования прямоугольника в моей программе:

glBegin(GL_QUADS);
    glTexCoord2f(0.0f, maxTexCoordHeight);              glVertex2i(pos.x, pos.y + height);
    glTexCoord2f(0.0f, 0.0f);                           glVertex2i(pos.x, pos.y);
    glTexCoord2f(maxTexCoordWidth, 0.0f);               glVertex2i(pos.x + width, pos.y);
    glTexCoord2f(maxTexCoordWidth, maxTexCoordHeight);  glVertex2i(pos.x + width, pos.y + height);
glEnd();

Рисует простой прямоугольник с указанной текстурой, например вот так: введите описание изображения здесь

Я хотел бы спросить, возможно ли в OpenGL добиться эффекта границы следующим образом:

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

Если граница должна быть одного цвета, я могу попробовать нарисовать пустой, незаполненный прямоугольник, используя GL_LINES вокруг моей текстуры , но это не так.

Также, если бы плитки всегда имели фиксированный размер, я мог бы подготовить текстуру, которая бы соответствовала этому, но они ДОЛЖНЫ быть легко изменяемыми без изменения файла растрового изображения, который я использую в качестве текстуры.

Итак, если это невозможно с базовыми функциями OpenGL, какие подходы для достижения этого эффекта были бы наиболее эффективными и /или простыми?

РЕДАКТИРОВАТЬ: это должно быть 2D.

7 голосов | спросил Piotr Chojnacki 12 WedEurope/Moscow2012-12-12T17:34:17+04:00Europe/Moscow12bEurope/MoscowWed, 12 Dec 2012 17:34:17 +0400 2012, 17:34:17

2 ответа


0

Это классическая проблема графических интерфейсов с OpenGL, которая часто решается с использованием шаблона из 9 ячеек. При этом вы добавляете эффект к исходному изображению (или определяете его с помощью других параметров opengl) и разделяете визуализированный квад на девять квадратов: три строки и три столбца.

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


В связи с тем, что было сказано в комментариях, вы также можете использовать реальные 3D-эффекты, создав квад-3D. Никто не заставляет вас использовать перспективную проекцию, в этом случае вы можете остаться с ортогональной проекцией (2D-режим). OpenGL всегда будет делать 3D-расчеты в любом случае.

ответил Jonas Schäfer 12 WedEurope/Moscow2012-12-12T18:10:16+04:00Europe/Moscow12bEurope/MoscowWed, 12 Dec 2012 18:10:16 +0400 2012, 18:10:16
0

Помимо отличного ответа Джонаса, я хочу добавить еще два варианта.
Первый - сделать текстуру похожей на нужный вам квадрат. Не нужно никакого причудливого кода, если вы можете сделать это в фотошопе;).
Второе - немного усложнить код рисования. Если вы посмотрите на свое изображение, то увидите, что каждый «боковой уклон» вашего квадрата можно нарисовать двумя треугольниками. Вы можете заставить свой код рисовать 10 треугольников вместо одного квадрата и использовать разные цвета для каждой группы из двух треугольников:

draw() {
    GLFloat i = <your_inset_here>;

    //top border part, top left triangle
    glColor3f(<color_0>);
    glVertex2f(pos.x, pos.y);
    glVertex2f(pos.x + w, pos.y);
    glVertex2f(pos.x + i, pos.y + i);
    //top border part, bottom right triangle
    glVertex2f(pos.x + w, pos.y);
    glVertex2f(pos.x + w - i, pos.y + i);
    glVertex2f(pos.x + i, pos.y + i);

    //repeat this process with the other coordinates for the other three borders

    // draw the middle square using {(pos.x+i,pos.y+i),(pos.x+w-i,pos.y+i),(pos.x+w-i,pos.y+h-i),(pos.x+i,pos.y+h-i)} as coordinates
}

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

ответил Kevin 4 FriEurope/Moscow2015-12-04T18:52:58+03:00Europe/Moscow12bEurope/MoscowFri, 04 Dec 2015 18:52:58 +0300 2015, 18:52:58

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132