Qt(特に4.6)ユーザーの多くは、OpenGLチュートリアルで提供されているオーバーペイントの例に精通しています。私は非常に似たようなことをしようとしていますが、古い固定関数パイプラインの代わりに、純粋な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のシェーダーが投影/変換行列にアクセスできないことを意味します。そのため、赤い三角形が描画され始めますが、おそらく画面外のどこかにあります。