你们中的许多 Qt(特别是 4.6)用户将熟悉 OpenGL 教程中提供的 Overpainting 示例,我正在尝试做一些非常相似的事情,但使用纯 OpenGL 数据的着色器,而不是旧的固定功能管道。
// 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 的着色器无法访问我的投影/变换矩阵,所以我的红色三角形开始绘制 - 但可能在屏幕外的某个地方。