LINUX.ORG.RU

OpenGL: проблемы со сглаживанием


0

0

Здравствуйте!

Вот, пример простейшего SDL-приложения (вернее тут только фрагмент - функция
инициализации OpenGL и прорисовки экрана), который выводит изображение на
экран влевом нижнем углу в масштабе 1:1.

Сглаживание работает, но при этом откуда-то появляется диагональная линия (такая
же как при методе задания граней GL_TRIANGLE_FAN - но там она ещё
естественна) от левого нижнего угла текстуры, до правого верхнего. Откуда она
берётся (точно не из рисунка - проверил неоднократно "пипеткой" в Gimp)??

И ещё поразила скорость вывода при попытки вывести изображение размером
1024x768 - ужасно долго (секунд 10, наверное проходит до появления картинки)!
При отключении сглаживания - мгновенно. Оно что там не аппаратно что ли
производиться?

static void draw_screen( void )
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    glTranslatef(-1024.0f/2, -768.0f/2, -768.0f/2);

    glBegin(GL_QUADS);

    glBindTexture( GL_TEXTURE_2D, texture );
    glTexCoord2f( 0.0f,  texh);
    glVertex2f( 0.0f, 0.0f);

    glTexCoord2f( texw,  texh);
    glVertex2f( texpw, 0.0f);

    glTexCoord2f( texw,  0.0f);
    glVertex2f( texpw, texph);

    glTexCoord2f( 0.0f,  0.0f);
    glVertex2f( 0.0f, texph);

    glEnd();

    SDL_GL_SwapBuffers();
}

static void setup_opengl( int width, int height )
{
    glViewport(0,0,width, height);
    //Todo: load textures
    if (!LoadGLTextures()) {
        printf ("Failure to load textures");
        exit(1);
    }

    glEnable(GL_TEXTURE_2D); //enable texture mapping
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //Black Background
    glDisable(GL_DEPTH_TEST); //disables depth testing
    glDisable(GL_ALPHA_TEST);

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

    glEnable(GL_POLYGON_SMOOTH);
    glHint(GL_POLYGON_SMOOTH_HINT,GL_NICEST);

    glShadeModel(GL_SMOOTH); //enables smooth color shading

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity(); //Reste projection matrix

    gluPerspective(90.0f, (GLfloat)width/(GLfloat)height, 1.0f, 1024.0f);
    //calculate aspect ratio of the window
    glMatrixMode(GL_MODELVIEW);
}
★★★★★

не юзай GL_POLYGON_SMOOTH :)) Это шлак.

А сглаживание лучше сделать анизотропной фильтрацией (GF4MX вроде x2 поддерживает - хватает). Blend также жрет нехило ресурсы (в более-менее посложнее проекте его нужно включать непосредственно перед отрисовкой, а потом выключать).

> при попытки вывести изображение размером 1024x768 - ужасно долго (секунд 10, наверное проходит до появления картинки)

Все правильно! У тебя картинка грузится долго. Вообще очень хорошее правило: не делай текстуру больше 512х512. Насколько я понимаю, у тебя npot текстура, которая масштабируется к pot при загрузке (через gluScaleImage). Вариант еще может быть такой:

Грузиш npot текстуру, делаеш новый SDL_Surface pot-размеров с альфой, далее блитаеш свою картинку туда, но отрисовываеш только нужную часть (через текстурные координаты). Так и работает быстрее и качество картинки не пострадает.

Удачи. Могу посоветовать сходить на наш форум (на plg.lrn.ru). Там побольше народу, кто этим занимается :)

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

> не юзай GL_POLYGON_SMOOTH :)) Это шлак.
Хм.. Я не понимаю :-)

> А сглаживание лучше сделать анизотропной фильтрацией (GF4MX вроде x2 поддерживает - хватает).
Что ж - гугль рулит:
http://www.gamedev.ru/articles/?id=20100
Помогло! Всё отлично, теперь всё нормально - под 200 К/с. Картинка во весь экран - 120 К/с. Надо бы пожалуй ещё про расширения почитать.

> Blend также жрет нехило ресурсы (в более-менее посложнее проекте его нужно включать непосредственно перед отрисовкой, а потом выключать).
Не понимаю - как он может жрать ресурсы когда не происходит прорисовки?

> Все правильно! У тебя картинка грузится долго.
Да, нет - с тем сглаживанием даже мелкая картинка выводилась с частотой 14 К/с, ну а большая... вот так долго рисовалась.

> Вообще очень хорошее правило: не делай текстуру больше 512х512.
Ну, это верно - вообще вряд ли могут понадобиться текстуры большего размера (по-крайней мере в 2D)

> Насколько я понимаю, у тебя npot текстура, которая масштабируется к pot при загрузке (через gluScaleImage).
У меня png-картинка грузиться через SDL_image, затем создаётся текстура размером степенью двойки, туда копируется - в общем стандартный метод отображение png.
О gluScaleImage ничего не знаю :-)

> Удачи. Могу посоветовать сходить на наш форум (на plg.lrn.ru). Там побольше народу, кто этим занимается :)
Спасибо, обязательно загляну, если ещё возникнут вопросы.

Всё, всем огромное спасибо (за ссылку тоже).

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