Mac 上的 SDL2 + Opengl 黑窗

Dam*_*nbo 2 c++ opengl sdl

我正在尝试在 mac osx yosemite 上使用 SDL2 和 OpenGL,我遵循了 SDL 页面上的示例以及 Lazy Foo 页面上的示例http://lazyfoo.net/tutorials/SDL/50_SDL_and_opengl_2/index.php但是每次我运行代码时,我都会得到相同的结果,一个黑色背景的空白窗口,我已经在谷歌上搜索了一段时间,但我仍然没有得到任何解决方案,我将不胜感激任何帮助

\n\n

下面是我的代码

\n\n
/*\n * Main.cpp\n *\n *  Created on: Sep 15, 2015\n *      Author: Damian-Machine\n */\n#include <OpenGL/gl.h>\n#include <OpenGL/glu.h>\n#include<SDL.h>\n#include<SDL_opengl.h>\n#include <stdio.h>\n#include <string>\n#include<iostream>\n#define SCREEN_WIDTH 640\n#define SCREEN_HEIGHT 480\n\nbool init();\n\nbool initGL();\n\nvoid handleKeys(unsigned char key, int x, int y);\n\nvoid update();\n\nvoid render();\n\nvoid close();\n\nSDL_Window *gWindow = NULL;\n\nSDL_GLContext gContext;\n\nbool gRenderQuad = true;\n\nint main(){\n    SDL_Event e;\n    bool quit = false;\n    if(!init()){\n        printf("Failed to initialize!\\n");\n        return 0;\n    }\n    SDL_StartTextInput();\n\n\n    while(!quit){\n        while(SDL_PollEvent(&e) !=0){\n            if(e.type == SDL_QUIT){\n                quit = true;\n            }else if (e.type == SDL_TEXTINPUT){\n                int x = 0, y = 0;\n                SDL_GetMouseState(&x, &y);\n                handleKeys(e.text.text[0], x, y);\n            }\n\n        }\n\n        render();\n    }\n\n    SDL_StopTextInput();\n\n    close();\n}\n\nbool init(){\n    bool success = true;\n    if(SDL_Init(SDL_INIT_VIDEO) < 0){\n        printf("SDL could not initialize! SDL Error: %s\\n", SDL_GetError());\n        success = false;\n    }else{\n        printf("SDL Opengl context created successfully\\n");\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);\n        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);\n\n\n        printf("Checking failed status: %s\\n", SDL_GetError());\n\n        //Create window\n        gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED,\n                SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL);\n\n        //std::cout << "OpenGL version " << glGetString\xe2\x80\x8b(GL_VERSION\xe2\x80\x8b) << std::endl;\n      //std::cout << "GLSL version " << glGetString\xe2\x80\x8b(GL_SHADING_LANGUAGE_VERSION\xe2\x80\x8b\xe2\x80\x8b) << std::endendl;\n        if( gWindow == NULL )\n        {\n            printf( "Window could not be created! SDL Error: %s\\n", SDL_GetError() );\n            success = false;\n        }else { //Create context\n            gContext = SDL_GL_CreateContext( gWindow );\n            if( gContext == NULL ) {\n                printf( "OpenGL context could not be created! SDL Error: %s\\n", SDL_GetError() );\n                success = false;\n            } else { //Use Vsync\n                if( SDL_GL_SetSwapInterval( 1 ) < 0 ) {\n                    printf( "Warning: Unable to set VSync! SDL Error: %s\\n", SDL_GetError() );\n                } //Initialize OpenGL\n                if( !initGL() ) {\n                    printf( "Unable to initialize OpenGL!\\n" ); success = false;\n                }\n            }\n        }\n    }\n    return success;\n}\n\nbool initGL(){\n    bool success = true;\n\n    GLenum error = GL_NO_ERROR;\n    glViewport(0, 0, SCREEN_WIDTH,SCREEN_HEIGHT);\n    glEnable(GL_BLEND);\n    glEnable(GL_DEPTH_TEST);\n\n    glMatrixMode(GL_PROJECTION);\n    glLoadIdentity();\n\n    error = glGetError();\n    if(error != GL_NO_ERROR){\n        printf("Error initializing OpenGL! %s\\n", gluErrorString(error));\n        success = false;\n    }\n\n    glShadeModel(GL_SMOOTH);\n    glMatrixMode(GL_MODELVIEW);\n    glLoadIdentity();\n\n\n    error = glGetError();\n    if(error != GL_NO_ERROR){\n        printf("Error initializing OpenGL %s\\n", gluErrorString(error));\n        success = false;\n    }\n\n    glClearColor(1.f, 0.f, 0.f, 1.f);\n\n    error = glGetError();\n    if(error != GL_NO_ERROR){\n        printf("Error initializing OpenGL %s\\n", gluErrorString(error));\n        success = false;\n    }\n    return success;\n}\n\nvoid handleKeys( unsigned char key, int x, int y ) {\n    //Toggle quad\n    if( key == \'q\' )\n    {\n        gRenderQuad = !gRenderQuad;\n    }\n}\n\nvoid update(){\n\n}\n\nvoid render(){\n    glClear(GL_COLOR_BUFFER_BIT);\n\n    if(gRenderQuad){\n        glRotatef(0.4f,0.0f,1.0f,0.0f);    // Rotate The cube around the Y axis\n        glRotatef(0.2f,1.0f,1.0f,1.0f);\n        glColor3f(0.0f,1.0f,0.0f);\n        glBegin(GL_QUADS);\n            glVertex2f( -0.5f, -0.5f );\n            glVertex2f( 0.5f, -0.5f );\n            glVertex2f( 0.5f, 0.5f );\n            glVertex2f( -0.5f, 0.5f );\n        glEnd();\n    }\n    SDL_GL_SwapWindow(gWindow);\n}\n\nvoid close(){\n    SDL_GL_DeleteContext(gContext);\n    SDL_DestroyWindow(gWindow);\n    gWindow = NULL;\n    SDL_Quit();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

ami*_*itp 5

正如Reto Koradi所说,这是版本不匹配。OpenGL 几十年来经历了很多变化,\xe2\x80\x9ccore\xe2\x80\x9d 配置文件禁用了您和 LazyFoo 正在使用的旧功能。

\n\n

LazyFoo 第 50 页使用 OpenGL 2.1 功能,但您的代码指定您仅使用核心 4.1 功能。删除这些行:

\n\n
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);\nSDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);\nSDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);\n
Run Code Online (Sandbox Code Playgroud)\n\n

使您的代码运行。然而,它只会产生一个空白的红屏。删除这一行:

\n\n
glEnable(GL_DEPTH_TEST);\n
Run Code Online (Sandbox Code Playgroud)\n\n

让绿色四边形显示在屏幕上:

\n\n

SDL 教程

\n\n

或者,如果您想使用深度缓冲区,请保留该glEnable行并将其更改glClear为:

\n\n
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n
Run Code Online (Sandbox Code Playgroud)\n\n

查看LazyFoo 第 51 页,了解如何用更现代的 OpenGL 编写内容。完全不一样了!您必须编写着色器,自己实现旋转,将所有顶点放入缓冲区。我用旧功能重新学习了 OpenGL,现在必须重新学习所有内容\xe2\x80\xa6

\n