"glGenTextures" возвращает ошибку 1282 при использовании 4.2 OpenGL - PullRequest
2 голосов
/ 26 апреля 2019

Я создаю текстуру OpenGL, используя функцию по умолчанию glGenTextures .Когда версия OpenGL установлена ​​на 3.0, все работает нормально, но когда я перезаписываю ее с 4.2 glGenTextures , начинает выдаваться ошибка # 1282 (недопустимая операция).Что я делаю не так?

Вот фрагмент кода, который я тестировал:

#include "GL/freeglut.h"
#include "GL/gl.h"

#define MAJOR_GL_VERSION 3
#define MINOR_GL_VERSION 0

int w = 200;
int h = 200;
const char* title = "title";

int main(int argc, char const *argv[])
{
    puts("Overriding default OpenGL version...");

    glutInitContextVersion(MAJOR_GL_VERSION, MINOR_GL_VERSION);
    glutInitContextProfile(GLUT_CORE_PROFILE);

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA);
    glutInitWindowSize(w, h);
    glutCreateWindow(title);

    printf("Using OpenGL Version: %s\n=========\n", (char*)glGetString(GL_VERSION));

    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, w, h, 0, -1, 1);
    glMatrixMode(GL_MODELVIEW);

    glEnable(GL_TEXTURE_2D);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);
    glEnable( GL_ALPHA_TEST );
    glEnable( GL_BLEND );

    GLenum error;
    GLuint id = 0;

    glGenTextures(1, &id);
    if((error = glGetError()) != GL_NO_ERROR || id == 0)
    {
        printf("Gl error: %s (errno %i)\n", gluErrorString(error), error);
        return 0;
    }

    while (1) { }

    return 0;
}

1 Ответ

3 голосов
/ 26 апреля 2019

Ошибка, вероятно, не происходит в той строке, которую вы ожидаете.Высоки шансы, что некоторые методы до glGenTextures являются проблемой.Ни одна из этих строк

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, h, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);

glShadeModel(GL_SMOOTH);

не разрешена в профиле ядра OpenGL.Профили были введены в OpenGL 3.2, поэтому запрос Core Profile не имеет никакого эффекта при запросе контекста 3.0.Но с 3.2+ вы получите профиль ядра, который удалил много вещей.

Вы можете удалить упомянутые выше строки и заменить их кодом, совместимым с Core-Profile.Или вы можете явно запросить профиль совместимости (glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE), если хотите придерживаться конвейера с фиксированными функциями.

...