LINUX.ORG.RU

[opengl] мерцает текст


0

1

Мерцает выводимый на экран текст. Двойная буферизация включена, и по идее ничего мерцать не должно. Линии, многоугольники и круги не мерцают, но в тексте мерцает все знаки, кроме первой буквы. При выводе нескольких строк не моргает только первая буква в первой строке. Вопрос знатокам opengl: ЧЯДНТ?

Мне удалось установить что моргание текста уменшьается если увеличть время в таймере.

#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
#include <cstdio>
#include "ftgl.h"


void RenderScene(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0f , 0.2f , 0.2f);
    glRasterPos2f(1, 1);
    FTGLPixmapFont font("/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf");
    if(font.Error())
        printf("Font not found\n");
    font.FaceSize(30);
    font.Render("Привет, мир!");
    glRasterPos2f(1, -4);
    glutSwapBuffers();
}

void ChangeSize(GLsizei w, GLsizei h) {
    if (h == 0)
        h = 1;
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    GLfloat aspectRatio = (GLfloat)w/(GLfloat)h;
    if (w <= h)
       glOrtho(-10.0, 10.0, -10.0/aspectRatio, 10.0/aspectRatio, 1.0,-1.0);
    else
        glOrtho(-10.0*aspectRatio, 10.0*aspectRatio, -10.0, 10.0, 1.0,-1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}


void onTimer(int a) {
    glutPostRedisplay();
    glutTimerFunc(16,onTimer,1);
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitWindowSize(800, 600);
    glutCreateWindow("hello");
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutDisplayFunc(RenderScene);
    glutReshapeFunc(ChangeSize);
    glutTimerFunc(16,onTimer,1);
    glClearColor(1.0f, 1.0f, 0.8f, 1.0f);
    glutMainLoop();
    return 0;
}
ПС Ещё есть подозрение, что делать главныйм циклом программы рекурсивно вызываемый тамер не очень хорошая идея.

Вот в этом вышеприведенном коде мерцает? Спрашиваю потому что скомпилировал его, запустил, и все отлично работает, не мерцает. Таймер тоже уменьшал, да.
freeglut: 2.6.0
ftgl: 2.1.3

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

Да мерцает в этом коде.
Версии freeglut и ftgl те же (Ubuntu 10.10).
А какая у вас видеокарта?

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

Но мерцание может быть из-за того что вы не чистите буфер глубины, потому оно костылится в сравнении. Но для того чтобы это было нужна анимация... А ее у вас нет. Ну для эксперимента, почистите буфер глубины

vertexua ★★★☆☆ ()

А зачем вы его постоянно перерисовываете?

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от vertexua

>man glutIdleFunc
Добавить glutIdleFunc(RenderScene)? Не помогает.

почистите буфер глубины

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) - Оно? тоже не помогает.
Анимация есть, просто в этом примере я постарался убрать все лишнее.

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

>А зачем вы его постоянно перерисовываете?
Предположим что помимо текста там есть анимация, которую надо перерисовывать.

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

Если карточка интеловская, забудьте про openGL.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от akinator

А вообще, без двойной буферизации ничего путного у вас не выйдет. Сложные сцены вообще жутко отрисовываться будут.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

У меня nvidia en8600gt. Вроде не такая уж и древняя видюжа. И сложных сцен не предполагается. Я пока только с 2д графикой работаю.

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

Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (opengl 2.1, mesa 7.10)
Еще попутно запустил на radeon hd4850, тоже все гладко. (opengl 3.3, catalyst 10.12)

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

>Если карточка интеловская, забудьте про openGL
щто?

xorik ★★★★★ ()

попробуйте вынести создание объекта шрифта за пределы функции RenderScene, в main или ChangeSize хотя бы.

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

Если карточка интеловская, забудьте про openGL

щто?

Ну, если вам нравится слайдшоу с fps~1..5, отсутствие VBO и некоторых других вещей, можно считать, что ничего.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от akinator

Т.е. мерцает даже с двойной буферизацией? Странно... А если текст средствами glut отрисовывать?

Да, попробуйте какой-нибудь прямоугольник нарисовать, без текста - тоже мерцать будет?

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Прямоугольник без текста не мерцает. С текстом тоже. Мерцает только текст.
Кроме того, если функцию glClear(GL_COLOR_BUFFER_BIT) перенести в самый конец RenderScene. То текст будет мерцать наоборот! То есть, обычно он исчезает на некоторые мгновения, а в этом случае будет появляться примерно на то же время.
У glutBitmapString те же симптомы.

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

Проверил на Intel 945GME - там всё прекрасно. Походу проблемма именно в моей видеокарте или драйверах к ней.

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

>Нет, в glutIdle поставьте glutPostRedisplay
Теперь мерцает всё, а не только текст.

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

И вообще, если непонятно что написано в коде шрифта, то о чем можно говорить? Может вы там экран чистите

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

С отключеным таймером все равно мерцает.
В каком коде шрифта? Для вывода текста я использую библиотеку ftgl.

akinator ★★ ()

Не мерцает.

ftgl 2.1.3rc5
freeglut 2.6.0
Radeon HD 3450
xf86-video-ati-git 20110328
xorg-server 1.10.0

age ()
Ответ на: комментарий от akinator

Ну мало ли, при таком кривом использовании как у вас она может что угодно там делать. Вы же шрифт в каждом кадре создаете. А где гарантия что с буферами ничего не делается во время создания шрифта. Хуже того, вы его на каждой итерации из файла грузите

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

>Вы же шрифт в каждом кадре создаете.
Ой, а слона то я и незаметил. Тем не менее, в этой теме мне уже советовали вынести создание объекта шрифта за пределы функции RenderScene. И ситуацию это не изменило.

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