Drawing a simple triangle horror when using std::vector

this is bullshit, the first VAO without std::vector get drawn but not the second with vector :confused: :

Vector3f Vertices[4];
Vertices[0] = Vector3f(-1.0f, -1.0f, 0.5773f);
Vertices[1] = Vector3f(0.0f, -1.0f, -1.15475f);
Vertices[2] = Vector3f(1.0f, -1.0f, 0.5773f);
Vertices[3] = Vector3f(0.0f, 1.0f, 0.0f);

unsigned int Indices[] = { 0, 3, 1,
                         1, 3, 2,
                         2, 3, 0,
                         0, 1, 2 };
GLuint VBO[2];
GLuint IBO[2];
unsigned int id[2];
glGenVertexArrays(2, id);
glGenBuffers(2, VBO);
glGenBuffers(2, IBO);

glBindVertexArray(id[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO[0]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);
struct Vertex
{
    Vector3f position;
    //Vector2f texCoord;
    //Vector3f normal;
    //int Boneindices[4];
    //float Weights[4];
};

vector<Vertex*> Vertices2;
Vertex* v=new Vertex();
v->position = Vector3f(-1.0f, -0.0f, 0);
Vertices2.push_back(v);
v->position = Vector3f(1.0f, -0.0f, -1);
Vertices2.push_back(v);
v->position = Vector3f(1.0f, -0.0f, 0);
Vertices2.push_back(v);
v->position = Vector3f(0.0f, 1.0f, 0.0f);
Vertices2.push_back(v);

struct Triangle
{
    int indices[3];
};
Triangle* t = new Triangle();
t->indices[0]=0;
t->indices[1]=3;
t->indices[2]=1;
vector<Triangle*> Indices2;
Indices2.push_back(t);
t->indices[0] = 1;
t->indices[1] = 3;
t->indices[2] = 2; 
Indices2.push_back(t);
t->indices[0] = 2;
t->indices[1] = 3;
t->indices[2] = 0;
Indices2.push_back(t);
t->indices[0] = 0;
t->indices[1] = 1;
t->indices[2] = 2;
Indices2.push_back(t);

glBindVertexArray(id[1]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)* Vertices2.size(), &Vertices2[0], GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Triangle)* Indices2.size(), &Indices2[0], GL_STATIC_DRAW);

for (size_t i = 0; i < 2; i++)
{
    glBindVertexArray(id[i]);
    glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_INT, 0);
    glBindVertexArray(0);
}

still get black screen, if nobody answers me here, who will ?

don’t make me regret creating this account

This post was flagged by the community and is temporarily hidden.

There’s no reason to expect a reply within 3 hours. This isn’t reddit; the number of people who visit this forum daily is probably in the single digits.

The reason why your second version doesn’t work is that the vector contains pointers to data rather than the actual data. If you’re coming to C++ from Java, don’t dynamically create objects with “new”, just use e.g.

std::vector<Vertex> Vertices2;
Vertex v;
v.position = Vector3f(-1.0f, -0.0f, 0);
Vertices2.push_back(v);

Correct me if I am wrong but I also believe this syntax is wrong.

GLuint VBO[2];
GLuint IBO[2];
unsigned int id[2];
glGenVertexArrays(2, id);
glGenBuffers(2, VBO);
glGenBuffers(2, IBO);

glBindVertexArray(id[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);

I am pretty sure that you need to pass in &VBO[2] for your gen buffer definition since it expects a address rather than an array

The name of an array in C/C++ will decay into a pointer to the first element of that array. Also, &VBO[2] is a pointer to the third element of an array containing two elements. It’s a valid past-the-end pointer, but it’s not what glGenBuffers is expecting.

This part of the code is 100% right (save that id should also use GLuint, but that’s mostly a matter of style).