Тестирование глубины OpenGL в Qt не работает

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

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 ответа

Решение

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

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

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 - это конечный автомат, и важным правилом конечных автоматов является то, что вы либо отслеживаете их состояние, либо должны переводить их в известное состояние всякий раз, когда собираетесь его использовать.

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

glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);
Другие вопросы по тегам