Qt OpenGL DrawElements not Drawing the second triangle

Qt OpenGL DrawElements not Drawing the second triangle

本文关键字:the second triangle Drawing not OpenGL DrawElements Qt      更新时间:2023-10-16

现在我正在按照Jamie King Qt OpenGL教程学习OpenGL。(他们很好(。

在其中一个教程中,我正在遵循它,但无法使用 DrawElemets 绘制两个顶点缓冲区三角形。 它适用于GLDrawArrays

请帮忙

提前谢谢。

GLWidget.h
#ifndef _GL_WIDGET_H_
#define _GL_WIDGET_H_
#include <QtOpenGLQGLWidget>
class GLWidget : public QGLWidget
{
public:
            GLWidget();
    virtual ~GLWidget();
protected:
    void initializeGL();
    void paintGL();
};
#endif
GLWidget.cpp
#include <glglew.h>
#include "globals.h"
#include "GLWidget.h"
using namespace std;
#define SIZE 1.0f

GLWidget::GLWidget()
{
}
GLWidget::~GLWidget()
{
}
// GLWindow Initialize function.
void GLWidget::initializeGL()
{

    // Initializing GLEW.
    GLenum err = glewInit();
    // Checking if the glew loads fine.
    if(err != GLEW_OK)
    {
        cerr<<"Cannot initialize GLEW: "<<err<<endl;
    }
    // Vertex Buffer storage space.
    GLuint vertBufferID;
    GLuint vertIndicesID;
    // Vertex array.
    GLfloat verts[] = 
    {
        // First traingle.
        +0.0f, +0.0f,   // 0
        +1.0f, +1.0f,   // 1    
        -1.0, +1.0,     // 2
        -1.0, -1.0,     // 3
        +1.0, -1.0,     // 4
    };
    // Creating the vertex buffer
    glGenBuffers(1, &vertBufferID);
    // binding the buffer.
    glBindBuffer(GL_ARRAY_BUFFER, vertBufferID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), &verts, GL_STATIC_DRAW);
    // Enalbing the position attribute of the vertex.
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
    // Creating the vertex indices buffer.
    GLushort indices[] = { 0, 1, 2, 0, 3, 4}; 
    glGenBuffers(1, &vertIndicesID);
    // binding the buffer.
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vertIndicesID);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertIndicesID), indices, GL_STATIC_DRAW);
}
// GLWindow Paint Function.
void GLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // Defining the viewport.
    glViewport(0, 0, width(), height());
    // Drawing the Triangle.
    //glDrawArrays(GL_TRIANGLES, 0, 6); 
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); 
}

上传索引缓冲区时:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertIndicesID), indices, GL_STATIC_DRAW);

您正在获取错误变量的大小。那应该是:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);


不确定您是否知道这一点,您没有指定步幅:

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

应该是

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), 0);

步幅是两个顶点在顶点缓冲区中相距的字节数。如果你告诉它它们是 0 分开,那么你基本上总是渲染相同的顶点。(根本不确定您是如何绘制第一个三角形的(。

更新:事实证明 0 是步幅的有效参数。OpenGL参考是这样说的:

指定连续泛型顶点之间的字节偏移量 属性。如果步幅为 0,则通用顶点属性为 被理解为紧紧地挤在阵列中。初始值为 0。

相关文章: