LINUX.ORG.RU

закрасить тестуру определенным ровным цветом

 color pikup, ,


0

1

Доброе.

Запиливаю unique color pikup для 2д движка.

Проблема следующая:

Есть текстура произвольной формы, необходимо закрасить ее ровным цветом так, чтобы не затронуть прозрачность.

Если мапить на квад с указанным цветом:

    glBegin(GL_QUADS);
    glColor3f(1.0f,0.0f,0.0f);
    glTexCoord2i(0, 0); glVertex2f( 0, 0 ); // upper left
    glTexCoord2i(0, 1); glVertex2f( 0, dY); // down left
    glTexCoord2i(1, 1); glVertex2f(dX, dY); // down right
    glTexCoord2i(1, 0); glVertex2f(dX, 0 ); // upper right
    glEnd();
То цвета текстуры умножаются. Т.е. текстура получается красной, а не ровно не закрашенной.

Подскажите, как это можно сделать средствами opengl без шаманства с пиксельными шейдерами?

В принципе, как запасной вариант, я могу использовать sdl для создании копии поверхности и закраски. Но шибко он уж медленный получается, особенно с учетом, что объекты могут генерится в рантайме :(

Во-первых есть glTexEnv, она как раз задаёт формулу для вычисления цвета фрагмента из текстуры и цвета (заданного glColor), вот абстрактный пример

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE);

Насколько я понял из документации, для прозрачности и цвета можно отдельно формулы задавать.

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

Третий вариант не к вашему случаю, упомяну на всякий: можно накладывать нечто полупрозрачное поверх, используя кастомную glBlendFunc, так можно придать оттенок низлежащей поверхности.

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

Спасибо.

Почему-то помог не GL_REPLACE, а GL_COMBINE... Закрасилось, но полупрозрачная тень все портит... Пробую выпилить ее :)

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

Так а в чем проблема? Текстура залита белым (1.0f,1.0f,1.0f), альфа для каждого пикселя своя там, где это нужно.
Дальше вы говорите, каким цветом окрасить текстуру при отрисовке квода:
glColor3f(1.0f,0.0f,0.0f); - красный цвет.
glColor3f(1.0f,1.0f,0.0f); - желтый цвет.

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

Что-то не могу победить полупрозрачные тени. Если игратся с альфа каналом glTexEnv то он затрагивает и полную прозрачность =\ А ее как раз хотелось бы оставить. :(

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

Пиксель текстуры предствляет четыре байта rgba - 0xff, 0xff, 0xff, alpha.

Я это понимаю. Я не понимаю ким образом можно «залить» текстуру определенным цветом.

(Да, с opengl «работаю» второй день :))

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

Вы имеете ввиду, выгрузить текстуру в память через glGetTexImage(), изменить нужные пиксели, и потом загрузить обратно?

этож очень медленно >.<

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

Я не понимаю ким образом можно «залить» текстуру определенным цветом.

glColor3f(1.0f,0.0f,0.0f); - красный цвет.
glColor3f(1.0f,1.0f,0.0f); - желтый цвет.

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

glEnable(GL_ALPHA_TEST)

Не используйте альфа-тест, он очень медленный, особенно на мобильных устройствах. Есть альфа-бленд.

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

glColor3f(1.0f,0.0f,0.0f); - красный цвет.

насколько я понимаю, вы имеете ввиду указание цвета на полигоне\кваде, и последующим наложением на него текстуры?

ну так вопрос как раз в том, что по умолчанию «зливка» идет с GL_MODULATE, который просто «окрашивает» текстуру в выбранный цвет.

В условиях задачи не «окрас» :)

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

В условиях задачи не «окрас» :)

А это что?

Есть текстура произвольной формы, необходимо закрасить ее ровным цветом так, чтобы не затронуть прозрачность.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu
glDisable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);

Не подходит же. Т.к. изменения применяются на всю картинку. А задача убрать только цвета с aplha < 1.

Или я чего-то не понимаю =\

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

поцоны, glColor - deprecated в совеременном ogl

Как и весь fixed pipeline.

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

В задаче — второе (закрасить ее ровным цветом)

Я бы сделал это шейдером. Где то так:

// frag:

void main()
{
gl_FragColor = vec4(0.1,0.0,0.0,1.0); // red color
}

// vert:

void main()
{
gl_Position = ftransform();
}

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

Похоже, что я не понимаю, что вам нужно.

На картинке выше, два тролля.

У первого, в текстуре, под ногами есть тень. Она полупрозрачна. При этом сам фон текстуры полностью прозрачен.

Если текстуру закрашивать через glTexEnvi(GL_TEXTURE_ENV ...) то эта полу прозрачность остается, и соответственно дает другой цвет (что для color pickup не приемлемо)

Игра с альфа каналом черевата тем, что будет затронута и прозрачность фона текстуры.

Т.е. по сути, нужно просто «игнорировать» все прозрачные участки у которых альфа != 1.0.

Что и делает код:

        glEnable(GL_ALPHA_TEST);
        glAlphaFunc(GL_EQUAL, 1.0);
        ....
        glDisable(GL_ALPHA_TEST);

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