C++ 为什么不是';我的三角形对象没有被画出来吗?

C++ 为什么不是';我的三角形对象没有被画出来吗?,c++,opengl,C++,Opengl,我正在创建一个OpenGL程序,它只是创建一个三角形并在屏幕上绘制它。我创建了一个名为Drawable的类,其中包含draw函数以及所使用的VAO和VBO对象。我还创建了一个从Drawable类继承的Triangle类。在Triangle类中,我有一个构造函数,它接受一个点数组和一个包含颜色的数组,并使用此数据初始化VAO&VBO(从Drawable继承) 在我的主函数中,我使用点和颜色数据初始化三角形,然后调用三角形对象上的draw函数(该draw函数为Drawable)。但最终,窗口将打开,

我正在创建一个OpenGL程序,它只是创建一个三角形并在屏幕上绘制它。我创建了一个名为Drawable的类,其中包含draw函数以及所使用的VAO和VBO对象。我还创建了一个从Drawable类继承的Triangle类。在Triangle类中,我有一个构造函数,它接受一个点数组和一个包含颜色的数组,并使用此数据初始化VAO&VBO(从Drawable继承)

在我的主函数中,我使用点和颜色数据初始化三角形,然后调用三角形对象上的draw函数(该draw函数为Drawable)。但最终,窗口将打开,三角形不会绘制。我在Drawable类中有一个简单的构造函数,如果我使用这个构造函数初始化对象并调用draw函数,它将显示该对象,因此我认为它不是我的draw函数。我能想到的唯一一件事是,由于我访问VAO&VBO对象的方式,可能它们实际上没有初始化到任何东西,但我不知道如何检查

可抽出的

class Drawable
{
    public:
        Drawable();

        void draw();
        GLuint objBuffer, VAO, program;
        std::string vShaderName, fShaderName;
        bool isUniform = false;
        int numVertices = 0;
        vec4 uniformColorVec;
};
Drawable.cpp

Drawable::Drawable()
{}

void Drawable::draw()
{
        GLuint program = InitShader(vShaderName.c_str(), fShaderName.c_str());
        glUseProgram(program);
        GLuint color_loc = glGetUniformLocation(program, "color");

        glBindVertexArray(VAO);

        glUniform4fv(color_loc, 1, uniformColorVec);
        glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices);

}
三角形.cpp

Triangle::Triangle(vec4 triPoints[3], vec4 color)
{
    uniformColorVec = color;

    vShaderName = "vshader00_v150.glsl";
    fShaderName = "fshader00_v150.glsl";
    numVertices = 3;

    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    glGenBuffers(1, &objBuffer);

    glBindBuffer(GL_ARRAY_BUFFER, objBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(triPoints), triPoints, GL_STATIC_DRAW);

    program = InitShader(vShaderName.c_str(), fShaderName.c_str());
    glUseProgram(program);

    GLuint vPosition = glGetAttribLocation(program, "vPosition");
    GLuint color_loc = glGetUniformLocation(program, "color");

    glEnableVertexAttribArray(vPosition);
    glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));

    glUniform4fv(color_loc, 1, uniformColorVec);

}
主文件

/* All the OpenGL windowing is intialized but I won't 
    include that since I know it's fine due to other objects being drawn
    correctly */


vec4 triPoints2[3] = {
    vec4(0.0, 0.0, 1.0, 1.0),
    vec4(-0.75, -0.75, 1.0, 1.0),
    vec4(0.0, -0.75, 1.0, 1.0)
};

vec4 blue_opaque = vec4(0.0, 0.0, 1.0, 1.0);

Triangle t;
t = Triangle(triPoints2, blue_opaque);

glClearColor(1.0, 1.0, 1.0, 1.0);

glClear(GL_COLOR_BUFFER_BIT);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

t.draw();

glFlush();

函数获得了<代码> VEC4三点[3 ] < /C>参数,但C++规则相当于<代码> VEC4*三点< /代码>作为函数参数。因此,

sizeof(三点)
不是数据的大小,而是指针本身的大小(4或8)。改为:

glBufferData(GL_ARRAY_BUFFER, sizeof(*triPoints)*numVertices, triPoints, GL_STATIC_DRAW);

glGetError
说了什么?我还建议不要使用
GL\u TRIANGLE\u FAN
,因为它是历史记录。@ybungalobill
glGetError
显示为0,因此它不会报告任何错误。如果更改
三角形t;t=三角形(三点2,蓝色不透明)直线到三角形t(三点2,蓝色不透明)?似乎是一样的。只有一扇白色的空窗户。我有一些
cout
,它显示了传递给三角形构造函数和可绘制显示函数的正确顶点数。非常感谢!我真的很感谢你的帮助。