Тестирование глубины OpenGL в Qt не работает - PullRequest
3 голосов
/ 18 февраля 2012

Я установил формат с помощью:

QGLFormat format = QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer);
setFormat(format);

в конструкторе .

Затем в initializeGL Я установил глубину тестирования.

void VoxelEditor::initializeGL()
{
    glClearDepth(2000.0);                                   // Enables Clearing Of The Depth Buffer
    glEnable(GL_DEPTH_TEST);                            // Enables Depth Testing
    glDepthFunc(GL_LESS);                               // The Type Of Depth Test To Do
    glShadeModel(GL_SMOOTH);                            // Enables Smooth Color Shading
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations
}

В paintGL я очищаю буфер глубины.

void VoxelEditor::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    draw();
}

Я помню, что раньше он работал с меньшим количеством вершин, так что, возможно, я использую слишком много для буфера глубины для обработки (?). У меня есть 32 * 32 * 32 вокселя, которые рисуются в половине случаев, поэтому 98304 квада.

Тестирование глубины, однако, все еще не работает и показывает квады в порядке исполнения.

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

Я исправил это, установив setDepthTest в draw ().

glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);
1 голос
/ 18 февраля 2012

, поэтому, возможно, я использую слишком много для буфера глубины для обработки (?).

Буфер глубины не учитывает вершины.Все, что он видит, это входящие фрагменты, и не имеет значения, сколько.

void VoxelEditor::initializeGL()
{
    glClearDepth(2000.0);   // Enables Clearing Of The Depth Buffer

Эта строка не включает очистку.Он устанавливает значение, до которого очищается буфер глубины.Значение должно быть в диапазоне 0… 1.Глубина очистки указана в нормализованных координатах устройства, т. Е. После применения вида модели, проекции и однородного разделения.Значение по умолчанию: 1.

    glEnable(GL_DEPTH_TEST);  // Enables Depth Testing
    glDepthFunc(GL_LESS);     // The Type Of Depth Test To Do
    glShadeModel(GL_SMOOTH)  // Enables Smooth Color Shading
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations

Нет, это не то, что делает.Перспектива - это просто линейное преобразование и всегда работает одинаково.Это означает, что координаты текстуры могут быть интерполированы другим способом для повышения качества.

}

Я всегда рекомендую помещать эти вызовы в функции рисования, потому что они не делаютинициализировать что угодно.Они устанавливают состояние рисования.OpenGL - это конечный автомат, и важным правилом конечных автоматов является то, что либо вы отслеживаете их состояние , либо , вы должны переводить их в известное состояние всякий раз, когда собираетесь его использовать.

...