Здравствуйте!
Вот, пример простейшего 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);
}
А сглаживание лучше сделать анизотропной фильтрацией (GF4MX вроде x2 поддерживает - хватает). Blend также жрет нехило ресурсы (в более-менее посложнее проекте его нужно включать непосредственно перед отрисовкой, а потом выключать).
> при попытки вывести изображение размером
1024x768 - ужасно долго (секунд 10, наверное проходит до появления картинки)
Все правильно! У тебя картинка грузится долго. Вообще очень хорошее правило: не делай текстуру больше 512х512. Насколько я понимаю, у тебя npot текстура, которая масштабируется к pot при загрузке (через gluScaleImage). Вариант еще может быть такой:
Грузиш npot текстуру, делаеш новый SDL_Surface pot-размеров с альфой, далее блитаеш свою картинку туда, но отрисовываеш только нужную часть (через текстурные координаты). Так и работает быстрее и качество картинки не пострадает.
Удачи. Могу посоветовать сходить на наш форум (на plg.lrn.ru). Там побольше народу, кто этим занимается :)
> не юзай 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). Там побольше народу, кто этим занимается :)
Спасибо, обязательно загляну, если ещё возникнут вопросы.