QOpenGLWidget no dibujará triángulo

Así que estoy tratando de implementar un editor para mi juego usando Qt, y parece que no puedo descifrar cómo funciona el QOpenGLWidget. En este momento, solo quiero obtener un triángulo simple para renderizar, entonces puedo preocuparme por moverme en el rest de mis cosas.

En este momento, abrirá la ventana y, en el QOpenGLWidget, se aclarará el color personalizado que configuré en la subclase (así que lo promocioné), pero no dibujará el triángulo descrito en la clase a continuación. He intentado seguir el ejemplo de Qt OpenGLWindow, así como los ejemplos de QOpenGLWidget y QOpenGLShaderProgram. También verifiqué todas las funciones que devuelven un bool para asegurarse de que todas se ejecutaron correctamente, y lo son, pero aún no hay triángulo.

¿Me perdí una llamada de función vital? ¿Estoy haciendo las cosas de la manera absolutamente equivocada? ¿O es algo súper sutil y extraño con Qt?

Aquí está el encabezado:

#include #include class EditorViewWidget : public QOpenGLWidget, protected QOpenGLFunctions { public: EditorViewWidget(QWidget *parent); protected: void initializeGL(); void resizeGL(int w, int h); void paintGL(); QOpenGLShaderProgram* shaderProgram; QOpenGLVertexArrayObject vao; QOpenGLBuffer VBO; int position_attribute; int color_uniform; float Vertices[9]; const char* vert="#version 150 \n" " \n" " in vec3 position; \n" " \n" " void main() \n" " { \n" " gl_Position = vec4(position, 1.0); \n" " }"; const char* frag="#version 150 \n" " \n" " uniform vec3 Color; \n" " out vec4 outColor; \n" " \n" " void main() \n" " { \n" " outColor = vec4(Color, 1.0); \n" " }"; }; 

y la fuente:

 EditorViewWidget::EditorViewWidget(QWidget* parent) :QOpenGLWidget(parent) { float v[] = { 0.0, 0.5, 0.0, 0.5, -0.5, 0.0, -0.5, -0.5, 0.0 }; for (int i = 0; i addShaderFromSourceCode(QOpenGLShader::Vertex, vert); shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, frag); shaderProgram->link(); shaderProgram->bind(); position_attribute = shaderProgram->attributeLocation("position"); color_uniform = shaderProgram->uniformLocation("Color"); VBO.create(); VBO.bind(); VBO.allocate(&Vertices, 9*sizeof(float)); shaderProgram->enableAttributeArray(position_attribute); shaderProgram->setAttributeArray(position_attribute, Vertices, 3); shaderProgram->setUniformValue(color_uniform, 1.0f, 1.0f, 1.0f); //glVertexAttribPointer(position_attribute, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); } void EditorViewWidget::resizeGL(int w, int h) { } void EditorViewWidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT); VBO.bind(); VBO.allocate(&Vertices, 9 * sizeof(float)); shaderProgram->enableAttributeArray(position_attribute); shaderProgram->setAttributeArray(position_attribute, Vertices, 3, 0); shaderProgram->setUniformValue(color_uniform, 1.0f, 1.0f, 1.0f); glDrawArrays(GL_TRIANGLES, 0, 3); shaderProgram->disableAttributeArray(position_attribute); } 

Especificaste los vértices de tu triángulo en el orden de las agujas del reloj. OpenGL los espera en orden antihorario por defecto. Cambia el segundo y tercer vértice y deberías ver tu triángulo

Usted está asignando y configurando los atributos de su VBO cada vez que llama a paintGL. Los VBO son para que solo puedas inicializarlos una vez y luego usarlos muchas veces. Luego, simplemente puede enlazar su VAO en su paintGL, llamar a glDrawArrays y luego desenlazar su VAO. Además, la desvinculación / liberación de su VBO y VAO se debe realizar después de glDrawArrays y después de configurar por primera vez los datos del atributo. No necesita un VAO si solo está usando un VBO. El único propósito de VAO es mantener varios VBO.

Está llamando a enableAttributeArray en lugar de setAttributeBuffer.

No estoy seguro de cuál de las anteriores hizo que tu triángulo no se dibujara correctamente, pero estoy casi seguro de que era una de ellas :).