Тестирование глубины 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);