我正在尝试在 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}\nRun Code Online (Sandbox Code Playgroud)\n
正如Reto Koradi所说,这是版本不匹配。OpenGL 几十年来经历了很多变化,\xe2\x80\x9ccore\xe2\x80\x9d 配置文件禁用了您和 LazyFoo 正在使用的旧功能。
\n\nLazyFoo 第 50 页使用 OpenGL 2.1 功能,但您的代码指定您仅使用核心 4.1 功能。删除这些行:
\n\nSDL_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);\nRun Code Online (Sandbox Code Playgroud)\n\n使您的代码运行。然而,它只会产生一个空白的红屏。删除这一行:
\n\nglEnable(GL_DEPTH_TEST);\nRun Code Online (Sandbox Code Playgroud)\n\n让绿色四边形显示在屏幕上:
\n\n\n\n或者,如果您想使用深度缓冲区,请保留该glEnable行并将其更改glClear为:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\nRun Code Online (Sandbox Code Playgroud)\n\n查看LazyFoo 第 51 页,了解如何用更现代的 OpenGL 编写内容。完全不一样了!您必须编写着色器,自己实现旋转,将所有顶点放入缓冲区。我用旧功能重新学习了 OpenGL,现在必须重新学习所有内容\xe2\x80\xa6
\n