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;
}
ПС Ещё есть подозрение, что делать главныйм циклом программы рекурсивно вызываемый тамер не очень хорошая идея.

★★

Последнее исправление: akinator (всего исправлений: 1)

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

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

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

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

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

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

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

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

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

akinator ★★
() автор топика
Ответ на: комментарий от 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 ★★
()

попробуйте вынести создание объекта шрифта за пределы функции 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

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

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

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

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

Да я уже понял, что это мой комп особый.

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

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

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

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

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