VBO: glBindBuffer выбрасывает Access violation execution location

Рейтинг: 0Ответов: 1Опубликовано: 03.04.2023

У меня есть код:

Tessellator Tessellator::draw() {
    if (!drawing)
        throw std::exception("Not drawing");

    GLuint vertexBuffer;
    glGenBuffers(1, &vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * vertices.size(), &vertices[0], GL_STATIC_DRAW);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_FLOAT, 0, 0);

    std::vector<GLuint> indices(vertices.size() / 2);
    for (GLuint i = 0; i < indices.size(); i++)
        indices[i] = i;
    GLuint indexBuffer;
    glGenBuffers(1, &indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indices.size(), &indices[0], GL_STATIC_DRAW);

    glColor3fv(activeColor);
    glDrawElements(primitiveMode, indices.size(), GL_UNSIGNED_INT, 0);

    glDeleteBuffers(1, &vertexBuffer);
    glDeleteBuffers(1, &indexBuffer);
    glDisableClientState(GL_VERTEX_ARRAY);

    this->vertices.clear();
    this->drawing = false;
    return *this;
}

на строке glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); выбрасывается Access violation execution location. Версия opengl 2. Также я не использую glfw, glew и т.д, а glGenBuffers и другие определяю так:

gldefs.h:

#define GLsizeiptr ptrdiff_t

typedef void (*PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
typedef void (*PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
typedef void (*PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void* data, GLenum usage);
typedef void (*PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers);

extern PFNGLGENBUFFERSPROC glGenBuffers;
extern PFNGLBINDBUFFERPROC glBindBuffer;
extern PFNGLBUFFERDATAPROC glBufferData;
extern PFNGLDELETEBUFFERSPROC glDeleteBuffers;

gldefs.cpp:

#include "gldefs.h"

PFNGLGENBUFFERSPROC glGenBuffers = (PFNGLGENBUFFERSPROC) wglGetProcAddress("glGenBuffers");
PFNGLBINDBUFFERPROC glBindBuffer = (PFNGLBINDBUFFERPROC) wglGetProcAddress("glBindBuffer");
PFNGLBUFFERDATAPROC glBufferData = (PFNGLBUFFERDATAPROC) wglGetProcAddress("glBufferData");
PFNGLDELETEBUFFERSPROC glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) wglGetProcAddress("glDeleteBuffers");

Ответы

▲ 0
#include "gldefs.h"

PFNGLGENBUFFERSPROC glGenBuffers;
PFNGLBINDBUFFERPROC glBindBuffer;
PFNGLBUFFERDATAPROC glBufferData;
PFNGLDELETEBUFFERSPROC glDeleteBuffers;

void init() {
    glGenBuffers = (PFNGLGENBUFFERSPROC) wglGetProcAddress("glGenBuffers");
    glBindBuffer = (PFNGLBINDBUFFERPROC) wglGetProcAddress("glBindBuffer");
    glBufferData = (PFNGLBUFFERDATAPROC) wglGetProcAddress("glBufferData");
    glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) wglGetProcAddress("glDeleteBuffers");
}