Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt OpenGL绘图元素未绘制第二个三角形_C++_Qt_Opengl - Fatal编程技术网

C++ Qt OpenGL绘图元素未绘制第二个三角形

C++ Qt OpenGL绘图元素未绘制第二个三角形,c++,qt,opengl,C++,Qt,Opengl,现在我正在跟随杰米·金学习OpenGL教程。(他们很好) 在其中一个教程中,我正在学习它,但无法使用抽屉集绘制两个顶点缓冲区三角形。它与gldrawArray一起工作 请帮忙 提前谢谢 GLWidget.h #ifndef _GL_WIDGET_H_ #define _GL_WIDGET_H_ #include <QtOpenGL\QGLWidget> class GLWidget : public QGLWidget { public: GLWidg

现在我正在跟随杰米·金学习OpenGL教程。(他们很好)

在其中一个教程中,我正在学习它,但无法使用抽屉集绘制两个顶点缓冲区三角形。它与gldrawArray一起工作

请帮忙

提前谢谢

GLWidget.h

#ifndef _GL_WIDGET_H_
#define _GL_WIDGET_H_

#include <QtOpenGL\QGLWidget>

class GLWidget : public QGLWidget
{
public:

            GLWidget();
    virtual ~GLWidget();

protected:
    void initializeGL();
    void paintGL();
};
#endif

GLWidget.cpp
#include <gl\glew.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); 
}
GLWidget.h
#ifndef\u GL\u WIDGET\u H_
#定义\u GL\u小部件\u H_
#包括
类GLWidget:publicqglwidget
{
公众:
GLWidget();
虚拟~GLWidget();
受保护的:
void initializeGL();
void paintGL();
};
#恩迪夫
GLWidget.cpp
#包括
#包括“globals.h”
#包括“GLWidget.h”
使用名称空间std;
#定义大小1.0f
GLWidget::GLWidget()
{
}
GLWidget::~GLWidget()
{
}
//GLWindow初始化函数。
void GLWidget::initializeGL()
{
//正在初始化GLEW。
GLenum err=glewInit();
//检查glew负载是否正常。
如果(错误!=GLEW_OK)
{

cerr上载索引缓冲区时:

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


你能更具体地说明什么不起作用吗?当你尝试时会发生什么?嗨,谢谢你的回答,