How to use vao and buffers in OpenGL 4.5

I would like to make a triangle using OpenGL 4.5. I found many examples on the Internet using older versions of OpenGL, but none of them use OpenGL 4.5 features. So I tried to "update" the code myself. This is the old working code:

// Triangles to render
vec3 vertices[2][3] = { { vec3(-0.90f, -0.90f, 1.0f), vec3(0.85f, -0.90f, 1.0f), vec3(-0.90f, 0.85f, 1.0f) },
                    { vec3(0.90f, -0.85f, 1.0f),  vec3(0.90f, 0.90f, 1.0f),  vec3(-0.85f, 0.90f, 1.0f) } };

//Initialize
glGenVertexArrays(1, &vaos);
glBindVertexArray(vaos);

glGenBuffers(1, &buffers);
glBindBuffer(GL_ARRAY_BUFFER, buffers);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangles), triangles, GL_STATIC_DRAW);

ShaderInfo shaders[] = {
    { GL_VERTEX_SHADER, "triangles.vert" },
    { GL_FRAGMENT_SHADER, "triangles.frag" },
    { GL_NONE, NULL }
};
program = LoadShaders(shaders);
glUseProgram(program);

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

//Render
GLint index;
index = glGetUniformLocation(program, "projectionMatrix");
glUniformMatrix3fv(index, 1, true, value_ptr(projectionMatrix));
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(vaos);
glDrawArrays(GL_TRIANGLES, 0, nvertices);

And I “updated” it to this code, which seems to draw nothing on the screen:

// Same triangles
// Initialize
glCreateVertexArrays(1, &vaos);
glEnableVertexArrayAttrib(vaos, 0);
glVertexArrayAttribFormat(vaos, 0, 3, GL_FLOAT, GL_FALSE, 0);

glCreateBuffers(1, &buffers);
glNamedBufferData(buffers, sizeof(triangles), triangles, GL_STATIC_DRAW);

glVertexArrayAttribBinding(vaos, 0, 0);
glVertexArrayVertexBuffer(vaos, 0, buffers, 0, 0);

ShaderInfo shaders[] = {
    { GL_VERTEX_SHADER, "triangles.vert" },
    { GL_FRAGMENT_SHADER, "triangles.frag" },
    { GL_NONE, NULL }
};
program = LoadShaders(shaders);
glUseProgram(program);

// Same render

Can someone tell me what I did wrong?

Edit: triangle.frag

#version 450

in vec4 gl_FragCoord;
out vec4 fColor;

void main ()
{
    fColor = vec4 (0.0, 0.0, 1.0, 1.0);
}

triangle.vert

#version 450

layout (location = 0) in vec3 vPosition;

uniform mat3 projectionMatrix;

void main ()
{
    vec3 tmp = projectionMatrix*vPosition;
    gl_Position = vec4 (tmp, 1.0f);
}
+4
source share
1 answer

Most likely, the culprit of this line:

glVertexArrayVertexBuffer(vaos, 0, buffers, 0, 0);

- stride, . glVertexAttribPointer stride, :

stride 0 glVertexAttribPointer, count * sizeof(type) .

glVertexArrayVertexBuffer 0 0, . glVertexArrayVertexBuffer shourtcut, , ( ) . ( , , .)

, , . , . , . ARB_vertex_attrib_binding ( GL 4.3), . (2) (3) :

(2) BindVertexBuffer?

RESOLVED: ,        .

(3) ​​ VertexAttribPointer?

: BindVertexBuffer ,        VertexAttribPointer . ,              VERTEX_ATTRIB_ARRAY_STRIDE, . ,        BindVertexBuffer,       stride VertexAttribPointer,        (VERTEX_BINDING_STRIDE).       VERTEX_BINDING_STRIDE.

, API       . :

    VertexAttribPointer(0, 3, FLOAT, FALSE, 12, 0);
    // VERTEX_ATTRIB_ARRAY_STRIDE = 12
    // VERTEX_BINDING_STRIDE = 12
    BindVertexBuffer(0, buffer, 0, 16)
    // now VERTEX_ATTRIB_ARRAY_STRIDE is still 12, but
    // VERTEX_BINDING_STRIDE = 16.

:

glVertexArrayVertexBuffer(vaos, 0, buffers, 0, 3*sizeof(GLfloat));
+1

Source: https://habr.com/ru/post/1657662/


All Articles