24 / 24 / 6
Регистрация: 12.04.2013
Сообщений: 122
1

Qt Буфер глубины

19.02.2015, 23:16. Показов 858. Ответов 6
Метки нет (Все метки)

Всем здрасьте.

У меня какие то необъяснимые проблемы с буфером глубины. А может и не с ним.. В общем артефчит по хардкору. То треугольник не нарисует вообще, то нарисует с рваными краями, то вообще все пропадет. На скрине пример.

Пишу в QtCreator 5.4.0. Кидаю исходник:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
OpenGLScene::~OpenGLScene()
{}
 
OpenGLScene::OpenGLScene(QWidget * parent) :
    QGLWidget(parent),
    timer_id(0),
    x_move(0.0),
    y_move(0.0),
    x_angle(0.0),
    y_angle(0.0),
    z_angle(0.0)
{
    /* Set view size */
    resizeScene(parent->geometry().width(), parent->geometry().height());
    /* Set timer for update */
    timer_id = startTimer(1, Qt::TimerType::PreciseTimer);
}
 
void OpenGLScene::resizeScene(int width, int height)
{
    makeCurrent();
 
    this->setGeometry(0, 0, width, height);
 
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, (GLdouble)width/(GLdouble)height, 0.0, 100000.0);
    gluLookAt(0.0, 0.0, 300.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    glMatrixMode(GL_MODELVIEW);
}
 
void OpenGLScene::glInit()
{
    qglClearColor(QColor(Qt::GlobalColor::black));
 
    glShadeModel(GL_SMOOTH);
    glEnable(GL_DEPTH);
 
    resizeScene(this->geometry().width(), this->geometry().height());
}
 
void OpenGLScene::initializeGL()
{
    QGLFormat format;
    format.setSwapInterval(60);
    format.setDoubleBuffer(true);
    format.setDepth(true);
    format.setAlpha(true);
    setFormat(format);
}
 
void OpenGLScene::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
 
    gluLookAt(0.0, 0.0, 300.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
 
    glEnable(GL_DEPTH_TEST);
 
    for(GLdouble i = 0.0; i <= 360.0; i += 60.0)
    {
        glPushMatrix();
            glLoadIdentity();
            glTranslated(x_move, y_move, 0.0);
 
            glRotated(x_angle, 1.0, 0.0, 0.0);
            glRotated(y_angle + i, 0.0, 1.0, 0.0);
            glRotated(z_angle, 0.0, 0.0, 1.0);
 
            glBegin(GL_TRIANGLES);
                glColor4d(1.0, 0.0, 0.0, 1.0);
                glVertex3d(0.0, 0.0, 0.0);
                glColor4d(0.0, 1.0, 0.0, 1.0);
                glVertex3d(100.0, 0.0, 0.0);
                glColor4d(0.0, 0.0, 1.0, 1.0);
                glVertex3d(0.0, 100.0, 0.0);
 
                glColor4d(1.0, 0.0, 0.0, 1.0);
                glVertex3d(0.0, 0.0, 0.0);
                glColor4d(0.0, 1.0, 0.0, 1.0);
                glVertex3d(100.0, 0.0, 0.0);
                glColor4d(0.0, 0.0, 1.0, 1.0);
                glVertex3d(0.0, -100.0, 0.0);
 
                glColor4d(1.0, 0.0, 0.0, 1.0);
                glVertex3d(0.0, 0.0, 0.0);
                glColor4d(0.0, 1.0, 0.0, 1.0);
                glVertex3d(-100.0, 0.0, 0.0);
                glColor4d(0.0, 0.0, 1.0, 1.0);
                glVertex3d(0.0, -100.0, 0.0);
 
                glColor4d(1.0, 0.0, 0.0, 1.0);
                glVertex3d(0.0, 0.0, 0.0);
                glColor4d(0.0, 1.0, 0.0, 1.0);
                glVertex3d(-100.0, 0.0, 0.0);
                glColor4d(0.0, 0.0, 1.0, 1.0);
                glVertex3d(0.0, 100.0, 0.0);
            glEnd();
        glPopMatrix();
    }
 
    glDisable(GL_DEPTH_TEST);
}
Я не понимаю что делаю не правильно.. Может проблема вообще в железе. У меня видеокарта: Asus AMD Radeon R9 270X [R9270X-DC2T-2GD5]
Миниатюры
Qt Буфер глубины  
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2015, 23:16
Ответы с готовыми решениями:

Буфер глубины (Qt)
почему glEnable(GL_DEPTH_TEST) работает только с выпуклыми фигурами?

Буфер глубины
Почему то не работает скрытие задних граней и т.д.Нарисовал пирамиду с помощью двух вееров...

Линейный буфер глубины
Как бы эту штуку сделать по умному? Сейчас делаю так: В вершинном шейдере: camSpacePosition...

Не работает буфер глубины
Не могу понять почему не работает буфер глубины. Часть треугольника которая должна углубиться по...

6
24 / 24 / 6
Регистрация: 12.04.2013
Сообщений: 122
19.02.2015, 23:18  [ТС] 2
На самом деле рисуется 4 треугольника. И выглядит это так. Но я еще дописываю цикл поворота. Чтобы несколько подряд отрисовались..
Миниатюры
Qt Буфер глубины  
0
24 / 24 / 6
Регистрация: 12.04.2013
Сообщений: 122
19.02.2015, 23:51  [ТС] 3
Пробил тоже самое через MVS 2013 в уже готовом проекте (ну там почти такой же класс работает и тоже используется Qt 5.4.0) и все пашед как надо. Чудеса.
Миниатюры
Qt Буфер глубины  
0
2516 / 1323 / 220
Регистрация: 26.02.2009
Сообщений: 6,098
Записей в блоге: 5
20.02.2015, 10:30 4
Цитата Сообщение от DENIS94 Посмотреть сообщение
Чудеса.
Ты б ещё в триллионах всё задал... подели все цифры на 100... и работай в области [-200..200] если хочешь избавиться от глюков с буфером глубины.
gluPerspective(60.0, (GLdouble)width/(GLdouble)height, 1.0, 100.0);
0
24 / 24 / 6
Регистрация: 12.04.2013
Сообщений: 122
20.02.2015, 12:17  [ТС] 5
Цитата Сообщение от snake32 Посмотреть сообщение
Ты б ещё в триллионах всё задал... подели все цифры на 100... и работай в области [-200..200] если хочешь избавиться от глюков с буфером глубины.
gluPerspective(60.0, (GLdouble)width/(GLdouble)height, 1.0, 100.0);
Послушал вашего "совета" задал в триллионах. С токи зрения математики ничего не поменялось. И результат такой же. Я нашел в чем проблема. я обратил внимание что у вас ближняя граница начинается с 1.0 а не с 0.0 как у меня.

Так работает:
C++
1
gluPerspective(60.0, (GLdouble)width/(GLdouble)height, 1.0, 100.0);
А так тем более:
C++
1
gluPerspective(60.0, (GLdouble)width/(GLdouble)height, 1.0, 1000000000000.0);
0
Псевдослучайный
1942 / 1142 / 97
Регистрация: 13.09.2011
Сообщений: 3,213
20.02.2015, 20:13 6
Цитата Сообщение от DENIS94 Посмотреть сообщение
С токи зрения математики ничего не поменялось.
Вот только разрядность буфера глубины не резиновая(а ещё он целочисленный, да) и, если размеры объектов будут несоразмерны объему отсечения, при приведении к ней можно получить не тот результат, который ожидается.
0
snake32
20.02.2015, 22:39     Qt Буфер глубины
  #7

Не по теме:

Цитата Сообщение от DENIS94 Посмотреть сообщение
я обратил внимание что у вас ближняя граница начинается с 1.0 а не с 0.0 как у меня.
о! не зря выделил жирным.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2015, 22:39

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Opengl SFML C++ буфер глубины
Opengl SFML C++ Помогите. Не могу разобраться, что не так. Не отображается нормально объект....

Проблема с FBO: не рендерится буфер глубины
Всем привет. Возникла проблема с рендером буфера глубины. Вот код создания буфера: void...

Буфер глубины. С++ (Что я делаю не так?)
Вместо изображение &quot;карты высот&quot; получаю стабильно просто белую текстуру, вне зависимости от...

OpenGL WinAPI C++ не работает буфер глубины
Написал маленький код на OpenGL WinAPI C++ В инете прочесал не один сайт с примером по глубине с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.