Вывод картинки OpenGL
От: Аноним  
Дата: 10.04.06 12:51
Оценка:
Как отрисовать в OpenGL картинку 640x480 с наименьшей потерей качетсва и скорости ?
Пробовал :
1. glDrawPixels — медленно
2. Через quad с текстурой — качество плохое

Как быть ?
Re: Вывод картинки OpenGL
От: Fella  
Дата: 10.04.06 13:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как отрисовать в OpenGL картинку 640x480 с наименьшей потерей качетсва и скорости ?

А>Пробовал :
А>1. glDrawPixels — медленно
А>2. Через quad с текстурой — качество плохое

А>Как быть ?


Не понял каким образом качество вывода на текстуру могло ухудшиться?
Если ты конечно LINEAR филтеринг не включил.
Re[2]: Вывод картинки OpenGL
От: Аноним  
Дата: 10.04.06 13:21
Оценка:
Здравствуйте, Fella, Вы писали:

F>Здравствуйте, Аноним, Вы писали:


А>>Как отрисовать в OpenGL картинку 640x480 с наименьшей потерей качетсва и скорости ?

А>>Пробовал :
А>>1. glDrawPixels — медленно
А>>2. Через quad с текстурой — качество плохое

А>>Как быть ?


F>Не понял каким образом качество вывода на текстуру могло ухудшиться?

F>Если ты конечно LINEAR филтеринг не включил.

пробовал и LINEAR и NEAREST (со вторым еще хуже).

Проясню ситуацию:
Есть окно 640x480.
делают так:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glViewport(0, 0, inWidth, inHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, inWidth, 0, inHeight, -100, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//коррекция углов
glTranslatef(0.375, 0.375, 0.0);

//переворот системы координат
glTranslated(0, inHeight, 0);
glRotated(180, 1, 0, 0);

glEnable(GL_TEXTURE_2D);

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

glShadeModel(GL_SMOOTH);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

glDrawBuffer(GL_FRONT_AND_BACK);
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
glDrawBuffer(GL_BACK);

glGenTextures(1, &name);
glBindTexture(GL_TEXTURE_2D, name);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

if (!pngLoad("abc.png", PNG_BUILDMIPMAP, PNG_ALPHA, &info))
{
.....
}

glColor4ub(255, 255, 255, 255);

glBindTexture(GL_TEXTURE_2D, name);

glBegin(GL_QUADS);

glTexCoord2f(0, 0);
glVertex2f(0, 0);

glTexCoord2f(1, 0);
glVertex2f(image->width, 0);

glTexCoord2f(1, 1);
glVertex2f(image->width, image->height);

glTexCoord2f(0, 1);
glVertex2f(0, image->height);

glEnd();

glFlush();
SwapBuffers(hdc);

если открыть эту же картинку в камом нибудь просмоторщике, то она там выглядит НАМНОГО лучше !
как отрисовать один в один ?
Re[3]: Вывод картинки OpenGL
От: Аноним  
Дата: 10.04.06 13:55
Оценка: -1
?
Re[4]: Вывод картинки OpenGL
От: Аноним  
Дата: 10.04.06 15:37
Оценка: -1
?UP
Re[3]: Вывод картинки OpenGL
От: Fella  
Дата: 11.04.06 08:25
Оценка:
Ты уверен что твой метод загрузки текстуры не преобразовывает картинку скажем в 512 на 512?
Вообщем попробуй загрузить картинку 512 на 512.
Re[4]: Вывод картинки OpenGL
От: Аноним  
Дата: 11.04.06 09:45
Оценка:
Здравствуйте, Fella, Вы писали:

F>Ты уверен что твой метод загрузки текстуры не преобразовывает картинку скажем в 512 на 512?

F>Вообщем попробуй загрузить картинку 512 на 512.

glpng если картинка не подходит под текстуру (размер не кратен 2),
ресайзит её до нужного размера (в большую сторону). короче сакс... придется этот ресайз переписать что бы просто в большую текстуру вставить картинку и выдать
её координаты в текстуре...
Re[5]: Вывод картинки OpenGL
От: Fella  
Дата: 11.04.06 12:23
Оценка:
А>glpng если картинка не подходит под текстуру (размер не кратен 2),
А>ресайзит её до нужного размера (в большую сторону). короче сакс... придется этот ресайз переписать что бы просто в большую текстуру вставить картинку и выдать
А>её координаты в текстуре...
Тебе надо картинку сделать размером кратным 2 в сторону увеличения, я так строки рисую в GL

double PowerX = log10(bmpwidth)/log10(2);
double PowerY = log10(bmpheight)/log10(2);
    
PowerX = ceil(PowerX);
PowerY = ceil(PowerY);
        
texwidth = pow(2, PowerX);
texheight = pow(2, PowerY);
        
texcoeffx = (float)(bmpwidth)/(float)texwidth;
texcoeffy = (float)(bmpheight)/(float)texheight;
Re[6]: Вывод картинки OpenGL
От: Аноним  
Дата: 11.04.06 13:34
Оценка:
Здравствуйте, Fella, Вы писали:

F>
F>double PowerX = log10(bmpwidth)/log10(2);
F>double PowerY = log10(bmpheight)/log10(2);
    
F>PowerX = ceil(PowerX);
F>PowerY = ceil(PowerY);
        
F>texwidth = pow(2, PowerX);
F>texheight = pow(2, PowerY);
        
F>texcoeffx = (float)(bmpwidth)/(float)texwidth;
F>texcoeffy = (float)(bmpheight)/(float)texheight;
F>


int SafeSize(int inSize)
{
static GLint maxTextureSize = 0;
int i;

if (maxTextureSize == 0)
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);

if (inSize > maxTextureSize)
return maxTextureSize;

for (i = 0; i < 24; ++i)
if (inSize <= (1<<i))
return 1<<i;
}

texwidth = SafeSize(bmpwidth);
texheight = SafeSize(bmpheight);

я делаю так...
но все равно спасибо...
разобрался... все ОК.
Re[7]: Вывод картинки OpenGL
От: Аноним  
Дата: 11.04.06 13:35
Оценка:
int SafeSize(int inSize)
{
static GLint maxTextureSize = 0;
int i;

if (maxTextureSize == 0)
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);

if (inSize > maxTextureSize)
return maxTextureSize;

for (i = 0; i < 24; ++i)
if (inSize <= (1<<i))
return 1<<i;

return maxTextureSize;
}

texwidth = SafeSize(bmpwidth);
texheight = SafeSize(bmpheight);
Re: Вывод картинки OpenGL
От: Vlad_  
Дата: 13.04.06 14:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как отрисовать в OpenGL картинку 640x480 с наименьшей потерей качетсва и скорости ?

А>Пробовал :
А>1. glDrawPixels — медленно
А>2. Через quad с текстурой — качество плохое

А>Как быть ?


Используй glDrawPixels. У него нормальная скорость, и картинку он не коробит.
Если у тебя картинка RGB то сделай вызов
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
Если RGBA
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);

У меня ортогональная проекция, фон рисуется таким образом.
    glDisable(GL_DEPTH_TEST);
    glRasterPos2f(0, (GLfloat)m_windowHeight);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glDrawPixels(m_image.GetWidth(), m_image.GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, m_image.pdata);


Все остальное рисуется поверх фона. Без тормозов почти на всех компах, даже на видео без 3D.
Re[2]: Вывод картинки OpenGL
От: alxn1 Россия  
Дата: 16.06.06 13:59
Оценка:
Здравствуйте, Vlad_, Вы писали:

V_>Все остальное рисуется поверх фона. Без тормозов почти на всех компах, даже на видео без 3D.


Не верю. Сам пробовал на cel-800 и RivaTNT2 — тормоза страшные. Это же каждый раз картинка перекачивается из ОП в видеопамять...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.