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

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

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

Зачем вообще спектрограмму превращать в битмап? Есть куча столбиков - их и рисовать. Просто и дешево.


#16
9:21, 3 дек. 2016

Вот тут батенька я вас не понял. Спеткрограмма действительно состоит из столбиков, а точнее окон. Каждый столбик состоит из отчётов, а не пикселей, т.е. отчёт описывается floatом, но не как ни пикселем RGBA. Второе, что значит рисовать столбики? Выводить по пикселям ? Нет уж увольте, я чашку чая успею сделать, пока спектрограмма будет рисоваться. Формировать из спектрограммы битмэп и потом его "сжать" под размер окна средствами GPU это идеальное решение, стоит только разобраться, как это сделать.
Любое дело требует последовательности, openGL не исключение, но в нашем мире надо всё и сразу и как можно быстрее, в этом вся сложность.
Идея с тайлами мне очень понравилась, правда немного туманно себе представляю, как это сделать. Нужно ещё, как то сохранить информацию между тайлами, чтобы не было явных контрастов на границе.

#17
9:27, 3 дек. 2016

Средствами OpenGL рисуется столбик целиком, а не по пикселям. Указываешь его геометрические размеры, цвет, может быть текстуру, которой залить хочешь.
Хотя... может я не прав, так не надо. Если масштаб сделать таким, что столбик станет уже пикселя размером, картинка превратится в мусор на большинстве видеокарточек. Билинейка-трилинейка обычно действуют только в пределах битмапа или маппинга.

#18
9:29, 3 дек. 2016

Я не смогу нарисовать столбик, потому, что столбиков слишком много чтобы уместить их на экран !!!!

#19
9:43, 3 дек. 2016

Abraziv
> Я не смогу нарисовать столбик, потому, что столбиков слишком много чтобы уместить их на экран !!!!
В случае openGL ты рисуешь не на экране, ты описываешь сцену, которую надо изобразить, возможно двумерную, в твоем случае.
Можешь наполнить ее произвольным количеством объектов любого размера, например фасетками столбиков спектрограммы. Потом устанавливаешь камеру, через которую видна вся сцена или ее часть.

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

#20
9:51, 3 дек. 2016

Даже не знаю, с чего начать и что лучше =))))

#21
10:05, 3 дек. 2016

Проблема может быть в том, что если объекты на сцене слишком маленькие, они накладываются друг на друга, слишком крупные пиксели не позволят отобразить их все. Чтобы картинка смотрелась в таких условиях, надо изображение интегрировать, как бы рисовать его с большим разрешением, а потом огрублять по всем правилам. Внутри одной фасетки, с битмапом, это сейчас способны делать буквально все видеокарточки, со сценой в целом - только отдельные самые дорогие.
Огрубление картинки - механика видеокарточки, тебе не надо заниматься этим лично.

#22
15:18, 3 дек. 2016

Что может быть за фигня.
Экспериментирую с текстурами, получаю какую-то фигню Не ведомая картинка с антивселенной | Вывести большой Bitmap в окно с помощью openGL. Причём рисунок не зависит, буду я подсовывать данные или же арифметическую прогрессию.
Инициализирую так:

void initializeGL()
{
    initializeOpenGLFunctions();

    glClearColor(0, 0, 0, 0);

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

    glEnable( GL_TEXTURE_2D );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
}

void paintGL()
{    
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();

   if(m_bDrawEnable)
   {
        glBindTexture(GL_TEXTURE_2D, m_uIdTexture);

        glBegin(GL_QUADS);

            glTexCoord2i(0, 0);
            glVertex2i(0, 0);

            glTexCoord2i(m_uCountWindow , 0);
            glVertex2i(m_uWidth, 0);

            glTexCoord2i(m_uCountWindow , m_uSizeWindow);
            glVertex2i(m_uWidth, m_uHeight);

            glTexCoord2i(0, m_uSizeWindow);
            glVertex2i(0, m_uHeight);

        glEnd();
   }
}


void resizeGL(int nWidth, int nHeight)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, nWidth, 0, nHeight, -1, 0);
    glViewport(0, 0, nWidth, nHeight);

    m_uWidth  = nWidth;
    m_uHeight = nHeight;

    if(m_bDrawEnable)
    {
        m_uSizeMap = nWidth * nHeight;
    }
}


void createColorBuffer()
{
    if(m_puColorBuffer != nullptr)
    {
        delete m_puColorBuffer;
    }

    m_puColorBuffer = new unsigned int[m_uSize];
    uint pixel;

    for(uint k = 0; k < m_uSize; ++k)
    {
        pixel = 0;
        pixel = (uint)(0xFF) << 24 |
                (uint)(0x10 * m_pfDataBuffer[k]) << 16 |
                (uint)(0x55 * m_pfDataBuffer[k]) << 8  |
                (uint)(0xFF * m_pfDataBuffer[k]);

        m_puColorBuffer[k] = pixel;
    }
}



void createTexture()
{
   // glEnable( GL_TEXTURE_2D );
    glGenTextures(1, &m_uIdTexture);
    glBindTexture(GL_TEXTURE_2D, m_uIdTexture);

    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    qDebug() << gluBuild2DMipmaps(GL_TEXTURE_2D, 4, m_uCountWindow, m_uSizeWindow , GL_RGBA, GL_UNSIGNED_BYTE, m_puColorBuffer );
}

#23
15:51, 3 дек. 2016

Если количество данных по Y увеличивать (размер окна), а размер по X соответственно уменьшить, то получаю:
Снимок | Вывести большой Bitmap в окно с помощью openGL

#24
16:46, 3 дек. 2016

Поменял:
void createTexture()
{
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glGenTextures(1, &m_uIdTexture);
    glBindTexture(GL_TEXTURE_2D, m_uIdTexture);

//    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
//    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    qDebug() << gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, m_uCountWindow ,m_uSizeWindow , GL_RGBA, GL_UNSIGNED_BYTE, m_puColorBuffer );


}

Так хоть что-то выводит.

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

#25
18:27, 3 дек. 2016

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

#26
18:30, 3 дек. 2016

Abraziv
Картинки сами себя не отфильтруют. Это оно такое мелкое? Мипмапы создавал?

#27
18:38, 3 дек. 2016

Это вот это.

    glGenTextures(1, &m_uIdTexture);
    glBindTexture(GL_TEXTURE_2D, m_uIdTexture);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    qDebug() << gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA,m_uCountWindow  ,m_uSizeWindow , GL_RGBA, GL_UNSIGNED_BYTE, m_puColorBuffer );

здесь https://www.opengl.org/wiki/Common_Mistakes#gluBuild2DMipmaps пишут что gluBuild2DMipmaps нельзя использовать

#28
18:39, 3 дек. 2016

Abraziv
> пишут что gluBuild2DMipmaps нельзя использовать
Ну так не используй?..

#29
18:42, 3 дек. 2016

Даже не знаю уже что и использовать, получилось бы хоть что нибудь, от этого бы и отталкивался.

Страницы: 1 2 3 4 5 6 7 Следующая »
ПрограммированиеФорум2D графика и изометрия

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