Подтвердить что ты не робот

Создание контекста OpenGL 3.2/3.x в SDL 1.3

Я столкнулся с проблемой, когда SDL говорит, что он не поддерживает контексты OpenGL 3.x. Я стараюсь следовать этому руководству: Создание кросс-платформы OpenGL 3.2 Контекст в SDL (C/SDL). Я использую GLEW в этом случае, но я не мог заставить gl3.h работать с этим. Это код, в котором я закончил:

#include <glew.h>
#include <SDL.h>    

int Testing::init()
        {
            if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
            {
                DEBUGLINE("Error initializing SDL.");
                printSDLError();
                system("pause");
                return 1; // Error
            }

            //Request OpenGL 3.2 context.
            SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
            SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

            //set double buffer
            SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

            //Create window
            window = SDL_CreateWindow("OpenGL 3.2 test",
                SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
                600, 400, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
            if(window == NULL) return 3; // Error

            //Print errors to console if there are any
            printSDLError(__LINE__);

            //Set up OpenGL context.
            glContext = SDL_GL_CreateContext(window);
            printSDLError(__LINE__);
            if(glContext == NULL)
            {
                DEBUGLINE("OpenGL context could not be created.");
                system("pause");
                return 4;
            }

            //Initialize glew
            GLenum err = glewInit();
            if(err != GLEW_OK)
            {
                DEBUGLINE("GLEW unable to be initialized: " << glewGetErrorString(err));
                system("pause");
                return 2;
            }

            return 0; // OK code, no error.
        }

Единственная проблема, о которой идет речь, - это попытаться вызвать SDL_GL_CreateContext(window), где SDL сообщает, что "GL 3.x не поддерживается". Тем не менее, как учебник, так и этот образец пакета (который я не утруждал тестированием) сообщали об успехе в объединении SDL 1.3 и OpenGL 3.2. Я знаю, что SDL 1.3 находится в середине разработки, но я несколько сомневаюсь, что даже непреднамеренная поддержка будет удалена.

Контекст все еще создается, и GLEW может инициализировать только штраф. (Я не могу понять, насколько я должен видеть версию контекста, который был создан, поскольку он должен быть основным профилем, и я не знаю, как это найти. Согласно учебнику, SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3) на самом деле ничего не делает, и в этом случае я не знаю, как создать соответствующий контекст или изменить контекст по умолчанию.)

EDIT: после некоторого тестирования благодаря полезной функции, которую дал мне Nicol, я обнаружил, что независимо от параметров, которые я передаю в SDL_GL_SetAttribute, контекст всегда является версией 1.1. Однако включение любой версии ниже 3.0 не выплеснет ошибку, говоря, что она не поддерживается. Поэтому проблема в том, что "основная" версия SDL видит только 1.1.

Для записи я использую Visual С++ 2010 express, GLEW 1.7.0 и последнюю версию SDL 1.3. Я новичок в использовании всех трех из них, и мне пришлось вручную создавать библиотеки SDL для 32-разрядных и 64-разрядных версий, поэтому многое может пойти не так. Тем не менее, 32 и 64-битные версии делают то же самое.

EDIT: Я использую nVidia 360M GPU с последним драйвером, который OpenGL Extension Viewer 4.04 сообщает, что он полностью совместим с OpenGL 3.3.

Любая помощь приветствуется.

UPDATE. Мне удалось заставить SDL перестать кричать на меня, что он не поддерживает контексты 3.x. Проблема заключалась в том, что SDL_GL_SetAttribute должен быть установлен BEFORE SDL_Init:

//Request OpenGL 3.2 context.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

//Initialize SDL
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
    DEBUGLINE("Error initializing SDL.");
    return 1; // Error
}

К сожалению, GLEW по-прежнему отказывается признать что-либо выше OpenGL 1.1 (только GLEW_VERSION_1_1 возвращает true), который все еще озадачен. glGetString(GL_VERSION) также сообщает 1.1.0. Похоже, что моя программа просто не знает о каких-либо более высоких версиях, как будто я их вообще не устанавливаю.

4b9b3361

Ответ 1

так как я не знаю, вы уже нашли решение, вот мое:

Я изо всех сил изо всех сил старался сегодня и вчера с этим. Невозможно использовать расширенные функции GL, поэтому я даже отлаживал файл opengl32.dll, чтобы увидеть, что он действительно работает и переносит вызовы в DLL OpenGL, специфичную для аппаратного обеспечения (nvoglnt.dll). Так что, должно быть, была другая причина. Были даже советы в Интернете, чтобы ссылаться на opengl32.lib перед всеми другими библиотеками, потому что SelectPixelFormat и некоторые другие функции перезаписываются друг другом.

Но это тоже не было причиной. Мое решение состояло в том, чтобы включить ускоренные визуальные эффекты здесь:

// init SDL
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_HAPTIC | SDL_INIT_TIMER) < 0) {       
    fprintf(stderr, "Could not init SDL");
    return 1;
}

// we must wish our OpenGL Version!!
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);

потому что в текущей версии SDL (15 декабря 2011 г.) он проверяет ее в SDL_windowsopengl.c

if (_this->gl_config.accelerated >= 0) {
       *iAttr++ = WGL_ACCELERATION_ARB;
        *iAttr++ = (_this->gl_config.accelerated ? WGL_FULL_ACCELERATION_ARB :
                                                   WGL_NO_ACCELERATION_ARB);
   }

и этот атрибут инициализируется -1, если вы не определили его самостоятельно.

И: Никогда устанавливать атрибуты версии перед инициализацией SDL, потому что для атрибутов настроек требуется правильная инициализация видеообъекта!

Надеюсь, это поможет.