Muchos de ustedes usuarios de Qt (4.6 específicamente) estarán familiarizados con el ejemplo de Overpainting proporcionado en los tutoriales de OpenGL, estoy tratando de hacer algo muy similar pero usando sombreadores para OpenGL puro datos, en lugar de la antigua tubería de función fija.Uso de QPainter sobre OpenGL en QGLWidget al utilizar sombreadores
// 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();
Estoy construyendo una aplicación de activos en 3D, por lo tanto, las cosas de la grilla. Para que sea realmente obvio cuando funciona, debe aparecer un gran rectángulo rojo en la esquina superior izquierda del widget, pero no es así.
El 3D funciona bien, pero QPainter no obtiene nada en la pantalla. La única diferencia real que puedo ver entre el mío y los documentos es que todos los cálculos de la matriz de proyección y transformación están escondidos en otras funciones y luego se cargan en el sombreador a través de glUniform. Presumiblemente, como QPainter divide los activos en 2D en triángulos, esto significa que los sombreadores de QPainter no tienen acceso a mis matrices de proyección/transformación, por lo que mi triángulo rojo comienza a dibujarse, pero quizás en algún lugar fuera de la pantalla.
Todavía no hay suerte, los datos 3D se ve afectado, pero no parece que los datos QPainter. Me pregunto si será más rápido/más fácil renderizar en un búfer de píxeles, cargarlo en un QPainter como un mapa de fondo, y luego 'pintar' en la parte superior antes de dibujar en la pantalla. ¿O es mucho más lento de lo que parece? – cmannett85
¿Aparecen los datos de QPainter si no realiza el dibujo en 3D? – baysmith
Rellené la función paintEvent() solo con las llamadas a QPainter (como en el ejemplo de pintura 2D en los documentos) y no aparece nada en la pantalla, excepto que el widget se rellena en negro. – cmannett85