Многие из вас, в частности пользователи Qt (4.6), знакомы с примером перекрашивания, приведенным в руководствах по OpenGL, я пытаюсь сделать что-то очень похожее, но использую шейдеры для чистых данных OpenGL вместо старой фиксированной функции.pipe.
// Set background and state.
makeCurrent();
qglClearColor( bgColour_ );
glEnable( GL_DEPTH_TEST );
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
if ( smoothLines_ ) {
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable( GL_LINE_SMOOTH );
glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
}
// Clear the buffers.
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glUseProgram( shader_ );
// Draw the grid.
try {
glLineWidth( 2.0f );
manager_->setColour( centreColour_ );
grid_->draw( oE_GLGrid::Centre );
glLineWidth( 1.5f );
manager_->setColour( majorColour_ );
grid_->draw( oE_GLGrid::Major );
glLineWidth( 1.0f );
manager_->setColour( minorColour_ );
grid_->draw( oE_GLGrid::Minor );
} catch( oE_GLException& e ) {
cout << "OpenGL Error: " << e.what() << endl;
return;
}
// Reset OpenGL state for overlays.
glDisable( GL_DEPTH_TEST );
if ( smoothLines_ ) {
glDisable( GL_BLEND );
glDisable( GL_LINE_SMOOTH );
}
// Draw the overlays.
QPainter p( this );
p.beginNativePainting();
p.fillRect( 10, 10, 100, 100,
QColor( 255, 0, 0 ) );
p.endNativePainting();
Я создаю приложение для 3D-ресурсов, поэтому я работаю с сеткой.Чтобы сделать это действительно очевидным, когда он работает, в левом верхнем углу виджета должен появиться большой красный прямоугольник - но это не так.
3D работает нормально, но QPainter ничего не выводит на экран.Единственное реальное различие, которое я вижу между моим и документами, состоит в том, что все вычисления матрицы проекции и преобразования скрыты в других функциях и затем загружаются в шейдер через glUniform.Предположительно, поскольку QPainter разделяет 2D-активы на треугольники, это означает, что шейдеры QPainter не имеют доступа к моим матрицам проекции / преобразования, поэтому мой красный треугольник начинает рисоваться - но, возможно, где-то за кадром.