簡體   English   中英

在SDL 1.3中創建OpenGL 3.2 / 3.x上下文

[英]Creating an OpenGL 3.2/3.x context in SDL 1.3

我遇到的問題是SDL表示它不支持OpenGL 3.x上下文。 我正在嘗試遵循本教程: 在SDL(C / SDL)中創建跨平台OpenGL 3.2上下文 我在這種情況下使用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)實際上沒有做任何事情,在這種情況下,我不知道如何獲得創建的適當上下文或更改默認上下文。)

編輯:經過一些測試得益於Nicol給我的有用功能,我發現,無論我傳遞給SDL_GL_SetAttribute的參數SDL_GL_SetAttribute ,上下文總是版本1.1。 但是,放入3.0以下的任何版本都不會吐出錯誤,說它不受支持。 所以問題是SDL看到的“核心”版本只有1.1。

為了記錄,我使用的是Visual C ++ 2010 express,GLEW 1.7.0和最新的SDL 1.3版本。 我是相當新的使用所有這三個,我不得不手動構建32位和64位版本的SDL庫,所以有很多可能會出錯。 到目前為止,32位和64位版本的功能完全相同。

編輯:我正在使用帶有最新驅動程序的nVidia 360M GPU,OpenGL Extension Viewer 4.04報告該驅動程序與OpenGL 3.3具有完全兼容性。

任何幫助表示贊賞。

更新 :我設法讓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。 似乎我的程序根本不知道任何更高版本,好像我根本沒有安裝它們。

因為我不知道你是否已找到解決方案,這是我的:

我今天和昨天用這些東西掙扎了很多。 無法使用高級GL函數,因此我甚至調試到opengl32.dll只是為了看它真的有效並將調用包裝到特定於硬件的OpenGL DLL(nvoglnt.dll)中。 所以一定有另一個原因。 互聯網上甚至有提示在所有其他庫之前鏈接到opengl32.lib,因為ChoosePixelFormat和其他一些函數被相互覆蓋。

但這也不是原因。 我的解決方案是在這里啟用加速視覺效果:

// 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修訂版(2011年12月15日)中,他在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之前不要設置版本屬性,因為設置屬性需要正確初始化視頻后端!

我希望這有幫助。

我按照本教程。 在windowz和linux上一切正常。 http://people.cs.uct.ac.za/~aflower/tutorials.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM