Войти
ПрограммированиеФорум2D графика и изометрия

Вывести большой Bitmap в окно с помощью openGL (4 стр)

Страницы: 1 2 3 4 5 6 7 Следующая »
#45
9:06, 4 дек. 2016

Не могу такой же цветовой композиции добиться.


#46
10:51, 4 дек. 2016

Abraziv
Блин, мне интернет отрубали.

> Альфа должна быть 0xFF для полностью не прозрачного изображения ?
Да.

>Не могу такой же цветовой композиции добиться.
А как данные формируются?

#47
12:13, 4 дек. 2016

.z. Сожалею.

Данные формируются очень просто. Берётся wav файл, загоняется в массив, делится на куски (окна) и над каждым куском считается БПФ. После данные нормируются, чтобы были от 0 до 1. После формируется битмэп:

        pixel = (uint)(0xFF) << 24 |
                ((uint)(0xFF * m_pfDataBuffer[hh])) << 16 |
                ((uint)(0x00 * m_pfDataBuffer[hh])) << 8  |
                (uint)(0x00  * m_pfDataBuffer[hh]);
//0xAARRGGBB

проблема в том, что нормирование данных сильно убивает их вес, т.е. значение, происходит это из-за того, что на низких частотах спектра всегда присутствует постоянная составляющая, вот из-за неё данные могут находиться в области тысячных или сотых. Казалось бы решение напрашивается само собой, использовать логарифм, но не тут то было, тогда данные размываются и битмэп принимает равномерный цвет, т.е. тогда вообще ничего не видать. Такие дела. Хрен его знает, как это побороть.
Кстати, что так  (uint)(0xFF) << 24 , что так  (uint)(0x00) << 24 не влияет на вывод совсем почему-то, хотя я устанавливал:

    glTexImage2D(GL_TEXTURE_2D ,0 ,GL_RGBA8, m_uCountWindow, m_uSizeWindow ,0 ,GL_BGRA ,GL_UNSIGNED_BYTE ,m_puColorBuffer);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3);
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
    glGenerateMipmap(GL_TEXTURE_2D);

#48
12:27, 4 дек. 2016

Вообще получается очень красиво и очень легко, всего строк 200 кода.
Снимок | Вывести большой Bitmap в окно с помощью openGL

#49
12:39, 4 дек. 2016

Abraziv
> проблема в том, что нормирование данных сильно убивает их вес
Может здесь что полезное найдешь http://forum.sources.ru/index.php?showtopic=329583
И вот http://www.graphicon.ru/html/2010/conference/RU/Se1/59.pdf

> (uint)(0x00 * m_pfDataBuffer[hh]
Хм.. Ты только красный канал заполняешь

> Кстати, что так  (uint)(0xFF) << 24 , что так  (uint)(0x00) << 24 не влияет на
> вывод совсем почему-то, хотя я устанавливал:
Это альфа канал. Прозрачности не увидишь, пока не включишь.
Текстура вроде правильно выводится

#50
12:42, 4 дек. 2016

Понял спасибо. Красный канал и хотел,  цвет же по вкусу ))))

#51
13:34, 4 дек. 2016

С чем можно поиграть, чтобы уменьшить размытие ?

#52
13:50, 4 дек. 2016

Abraziv
Что ты называешь размытием?

#53
15:52, 4 дек. 2016

Немного не понимаю, как перевести спектральный отчёт в RGB, чтобы не было размытия.
Так должно быть:
Снимок1 | Вывести большой Bitmap в окно с помощью openGL
Так сейчас:
Снимок3 | Вывести большой Bitmap в окно с помощью openGL

#54
16:32, 4 дек. 2016

Abraziv
> Немного не понимаю, как перевести спектральный отчёт в RGB, чтобы не было
> размытия.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);?

#55
17:02, 4 дек. 2016

Ничего не изменилось. Может дело в формировании пикселя ?
        pixel = (uint)(0xFF) << 24 |
                ((uint)(scal * 0xFF * m_pfDataBuffer[hh])) << 16 |
                ((uint)(scal * 0x20 * m_pfDataBuffer[hh])) << 8  |
                (uint)(scal * 0x20 * m_pfDataBuffer[hh]);

m_pfDataBuffer - массив с значениями от 0 до 1, правда там попадаются и тысячные и сотые, поэтому, чтобы их учесть умножаю на scal (5.0 - 10.0). Вообще когда подобные заплатки появляются, значит уже что то не так.
Работает конечно быстро, но качество полная фигня. И зачем мне эта быстрота тогда ?

#56
17:06, 4 дек. 2016

Abraziv
у них используется одномерная палитра по смыслу вроде такой, что тут справа:

+ Показать

сохраняешь такую палитру как одномерную текстуру, потом переводишь число из [0..1] в пиксель на этой текстуре, рисуешь. тебе придётся либо найти их палитру, либо нарисовать свою похожую.
#57
17:10, 4 дек. 2016

Suslik Спасибо за ответ. Правда туманно понимаю о чём идёт речь. Попробую погуглить. Спасибо огромное.

#58
19:28, 4 дек. 2016

Suslik
Так ваш алгоритм реализуется на шейдере? Нифига не нашел примера.

#59
12:09, 5 дек. 2016

Abraziv

uniform sampler2D paletteTex;
uniform sampler2D dataTex;
uniform vec2 viewportSize;

layout(location = 0) out vec4 resultColor;

int main()
{
  float palettePos = texture2D(dataTex, gl_FragCoord.xy / viewportSize).r; //значение 0..1
  resultColor = texture1D(paletteTex, palettePos); //перевод значения в цвет
}
Страницы: 1 2 3 4 5 6 7 Следующая »
ПрограммированиеФорум2D графика и изометрия

Тема в архиве.