LINUX.ORG.RU

Элементарное: Не могу отобразить текстурированный прямоугольник в OpenGL

 , , текстура


0

1

Начал пилить один небольшой проект и застрял в самом начале.

Не могу понять, как отобразить через OpenGL текстурированный 2D прямоугольник. Вместо текстуры отображается одноцветный прямоугольник. Причем отображается цветом, которым перед отрисовкой прямоугольника отрисовывалась надпись с FPS.

Вот минимальный пример:

https://anonfiles.com/0b79nc73n1/funMashine.tar_gz

Собирать можно как через cmake, так и через qmake. Используется голый C++11 со стандартными графическими библиотеками. Для загрузки картинки используется либа SOIL (в Дебиане она есть в стандартном репозитарии). Если собирать через qmake, то перед запуском нужно проследить чтобы рядом с бинарником лежала директория /pic.

В данном примере отрисовка картинки запускается в методе:

void WheelsKit::drawSource()
{
    CORE.imagesRepo().image("symbol01").draw();
}


Сам метод отрисовки выглядит так:
void Image::draw()
{
    // cout << "Draw texture id: " << mTextureId << "\n";

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBindTexture(GL_TEXTURE_2D, mTextureId);

    glBegin(GL_QUADS);
        glTexCoord2f(0.0, 0.0);
        glVertex3f(-0.5, -0.5, 0.0);
        glTexCoord2f(0.0, 1.0);
        glVertex3f(-0.5, 0.5, 0.0);
        glTexCoord2f(1.0, 1.0);
        glVertex3f(0.5, 0.5, 0.0);
        glTexCoord2f(1.0, 0.0);
        glVertex3f(0.5, -0.5, 0.0);
    glEnd();

    glBindTexture(GL_TEXTURE_2D, 0);
}


В переменной mTextureId хранится номер заранее загруженной в GPU текстуры. Загрузка текстуры происходит в начале программы, в методе:
void Image::load(string fileName) {...}


Инициализация OpenGL происходит при старте программы, в методе:
void Core::openGlInit(int &argc, char** argv)


Я уже третий день бъюсь со всякими параметрами OpenGL, но текстуру все еще не увидел. Видимо, я что-то упускаю, какую-то настройку. Что еще надо добавить/переделать?

★★★★★

glBegin это очень сильно deprecated, а вообще тебе за примером на заблокированный в РФ сайт по Opengl, там отличные примеры, видимо скрепы шатают.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от anonymous

А с вертексбуферами и шейдерами такая же долботня будет.
Я помнится какой-то хелловорлд opengl 4 с радужным треугольником никак не мог заставить работать. В итоге поменял местами какие-то вызовы функций, которые вообще друг к другу никакого отношения не имели по-идее, и заработало.

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

Примеры по ссылке что я привёл должны работать.

anonymous
()

https://i.imgur.com/d18Vp89.png

void Core::init(int &argc, char** argv)
{
    // Инициализация графики
    openGlInit(argc, argv);
+    // Включение наложения текстур (глобальное)
+    glEnable( GL_TEXTURE_2D );

    // Загрузка картинок
    mImagesRepo.load();
}

Я всё же порекомендовал перейти на OpenGL 2.x и шейдеры хоть самые первые. Ну если конечно не критично отсуцтвие их.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от peregrine

, а вообще тебе за примером на заблокированный в РФ сайт по Opengl, там отличные примеры, видимо скрепы шатают.

Просто сказочные. Кто-то пытался оспорить в суде?

anonymous
()
Ответ на: комментарий от peregrine

Лучший - не знаю, но на том, что я привёл, одновременно и всё разжёвано с нуля и есть примеры вплоть до довольно продвинутых, вроде PBR.

anonymous
()
Ответ на: комментарий от LINUX-ORG-RU

Есть:

Искомый адрес: 128.199.49.46 Всего найдено записей: 2

Таганский районный суд г. Москвы 2-1779/2018 13.04.2018

и

Генпрокуратура 27-31-2018/Ид2971-18 16.04.2018

monk ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

В реестре есть ip http://blocklist.rkn.gov.ru/ 128.199.49.46 Твоего провайдера на бутылку надо сажать. Оно Таганским судом заблокировано за экстремизм и персональные данные россиян

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 3)
Ответ на: комментарий от anonymous

Просто сказочные. Кто-то пытался оспорить в суде?

Так это Joey de Vries в московский суд подавать должен. Сложно.

monk ★★★★★
()
Ответ на: комментарий от peregrine

7zip пытался

Правда? А можно ссылку на подробности? Вроде только «Живая фотография» пыталась чего-то добиться.

monk ★★★★★
()
Ответ на: комментарий от monk

А, да он даже не пытался. Пытались пользователи, но они не могут судиться. Ну а судиться с судом по определению бесполезно. И скорее всего причина того, что сайт 7zip-а до сих пор заблокирован в WinRAR-е

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от monk

А теперь найди документы на которые они ссылаются )))))))))))))))))) И почитай :D

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от peregrine

Решения судов почитай, там предъявы к телеграм каналу где призывают к бяке всякой. Причём тут скромный сайт с позитивным оформлением и старательно написанным текстом как рисовать на экране всякую интересную всячину? Акстись! И ваще персональные данные мои мне всрать кто там что решил я ими управляю и точка, ну и никакого экстремизна там я не видел. Тут именно IP что важно и скорее всего потому что на нём же ещё что-то там хостится а под косу попадает всё. ((

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от peregrine

Ну а судиться с судом по определению бесполезно.

Так суд команды блокировать и не давал. там формулировка:

на Роскомнадзор и иных лиц возлагается обязанность прекратить создание технических условий для приема, передачи, доставки и (или) обработки электронных сообщений пользователей сети «Интернет», распространяемых посредством информационных систем и (или) программ для электронных вычислительных машин, функционирование которых обеспечивает Telegram Messenger Limited Liability Partnership.

А всё остальное — выполнение этой инструкции. РКН пишет

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

monk ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

А то, что черный фон у картинки и не видно прозрачности - это проблема на этапе создания/загорузки текстуры, или на этапе отрисовки её?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от monk

По IP суд постановил блокировать, а не РКН. Ну а то что от всех отмахиваются, это другая причина

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от Xintrea

Надо блендинг включать https://i.imgur.com/QrRx9II.png

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+   glEnable(GL_BLEND);
+   glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    glBindTexture(GL_TEXTURE_2D, mTextureId);

    glBegin(GL_QUADS);
        glTexCoord2f(0.0, 0.0);
        glVertex3f(-0.5, -0.5, 0.0);
        glTexCoord2f(0.0, 1.0);
        glVertex3f(-0.5, 0.5, 0.0);
        glTexCoord2f(1.0, 1.0);
        glVertex3f(0.5, 0.5, 0.0);
        glTexCoord2f(1.0, 0.0);
        glVertex3f(0.5, -0.5, 0.0);
    glEnd();

    glBindTexture(GL_TEXTURE_2D, 0);
+   glDisable(GL_BLEND);
LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Да просто демонстрашка с машинкой - колесики крутятся, корпус подпрыгивает, вид сбоку. Деревья и кусты проезжают на заднем фоне.

Кстати, все-таки с командами

+   glEnable(GL_BLEND);
+   glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

прозрачность появляется, но вот с цветом что-то не то:

http://i.piccy.info/i9/22adf69698429f6b1be2e4f61cf4410a/1569785105/174192/134...

Оригинальная картинка гораздо светлее, а OpenGL показывает какое-то темное нечто. Из-за чего это может быть?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

А, все, понял.

Перед этими строкам надо добавить

glColor3f(1.0, 1.0, 1.0);

чтобы смешивание цветов нормально шло.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Нужно залить саму поверхность нужным цветом, альфа пропускает цвет заливки там был тёмным вот и было всё затемнено =) https://i.imgur.com/WLKSikM.png

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_BLEND);

    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    glBindTexture(GL_TEXTURE_2D, mTextureId);

    glBegin(GL_QUADS);
+       glColor3f(1.0f,1.0f,1.0f);
        glTexCoord2f(0.0, 0.0);
        glVertex3f(-0.5, -0.5, 0.0);
        glTexCoord2f(0.0, 1.0);
        glVertex3f(-0.5, 0.5, 0.0);
        glTexCoord2f(1.0, 1.0);
        glVertex3f(0.5, 0.5, 0.0);
        glTexCoord2f(1.0, 0.0);
        glVertex3f(0.5, -0.5, 0.0);
    glEnd();

    glBindTexture(GL_TEXTURE_2D, 0);
    glDisable(GL_BLEND);

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от Deleted

Кстати да, часто подглядываю ибо вечно забываю то одно то другое

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Нужно залить саму поверхность нужным цветом, альфа пропускает цвет заливки там был тёмным вот и было всё затемнено

Я тут подумал, на самом деле не похоже... На загружаемой картинке альфа в 100% сделана только там где колесо не нарисовано. Там где пиксели колеса, там прозрачность нуливая 0%. То есть, выглядеть должно было примерно так:

http://i.piccy.info/i9/b67eb44d5bad5444d6295204caec217b/1569789992/74110/1340...

А в OpenGL-рендеринге всё колесо было темное.

То есть, похоже, что дефолтные значения glBlendFunc() для режима GL_BLEND - это по 0.5 для множителя первого и второго смешиваемого цвета. Поэтому исходная текстура становилась как-бы на 50% прозрачной и смешивалась с темным фоном.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Может быть,вероятно да так и есть, ну я на шейдерах привык что у меня все цвета либо вычисляются как-то либо модифицируются так что эти детали я чаще всего тупо не замечаю )) А вот на чистом пайплайне да это уже важно ибо всё должно быть явно вбито. =)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Эх, рано я обрадовался...

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

Но код завтра покажу, уже устал.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Bad_ptr

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

anonymous
()
Ответ на: комментарий от LINUX-ORG-RU

Странно, именно это я и делал в первую очередь. И отрисовывалась только одна картинка. Попробовал сейчас - да, работает какнада. Видимо, еще какие-то факторы влияли.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Bad_ptr

минимальное умение работать с fixed pipeline внушает чувство, что графическое программирование с opengl просто во всем, однако скоро вы обнаружите множество ограничений (невозможность толком настроить графический конвеер) — рекомендую почитать о разнице между фиксированным и программируемым конвеерами, и писать для OpenGL 4.x+, чтобы сэкономить себе в дальнейшем время

mazdai ★★★
()
Ответ на: комментарий от LINUX-ORG-RU

А нет, проблема действительно есть.

Сквозь прозрачные пиксели картинки просвечивает не то, что находится за картинкой, а просто цвет общего фона экрана. И то, что рисуется «после» не перекрывает того, что рисуется «до».

Другими словами: мне нужно нарисовать колесо, а поверх него корпус машинки. Я так и делаю:

    CORE.imagesRepo().image("wheel").draw();
    CORE.imagesRepo().image("automobile").draw();


И получается:

http://i.piccy.info/i9/14aaf5766ddca1d981b70c59fc485253/1569828594/136773/134...

То есть вообще что-то странное: я нарисовал колесо раньше машинки. Но машинка поверх колеса не нарисовалась. Она нарисовалась как-бы «за». При этом прозрачные пиксели колеса показывают цвет фона.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от anonymous

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

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

В общем, поборол проблему.

У меня в инициализации Z-буфер был включен, хоть я его при рисовании нигде не использовал:

    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    ...
    glEnable(GL_DEPTH_TEST);

Заменил этот код на:
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);

И рендеринг стал ожидаемо работать.

Чуствую, что будут проблемы, когда я таки захочу использовать Z-буфер для разбивки сцены на планы. Но пока хотя бы так.

Xintrea ★★★★★
() автор топика

Никогда не используй для отрисовки glBegin-ы. Это уже всё устарело несколько раз.

a1batross ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.