可靠地创建OpenGL上下文
Reliably creating an OpenGL context?
摘要:
OpenGL上下文已在开发计算机上成功创建,但当尝试分发应用程序时,屏幕仅显示黑色。分发OpenGL应用程序时需要考虑哪些问题?
详细信息:
我正在使用SDL2创建OpenGL 3.1上下文。上下文必须至少为3.1才能工作。
我还没有彻底测试过这个问题,所以我没有使用图形卡等信息。然而,我更感兴趣的是摘要中提出的一般问题,即在分发OpenGL应用程序时需要考虑什么。
这是上下文创建代码。
// CREATE SDL
U32 flags;
flags |= SDL_INIT_VIDEO;
flags |= SDL_INIT_EVENTS;
if(!SDL_WasInit(0)) // Make sure SDL is initialized.
SDL_Init(0);
CHECK(!SDL_InitSubSystem(flags));
// SET OPENGL ATTRIBUTES
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, config.glVersionMajor);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, config.glVersionMinor);
if(config.glCoreProfile)
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
else
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);
//SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, config.glDepthBuffer);
SDL_GL_SetSwapInterval(0);
// CREATE WINDOW
flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN;
if(config.fullscreen)
flags = flags | SDL_WINDOW_FULLSCREEN_DESKTOP;
else if(config.maximized)
flags = flags | SDL_WINDOW_MAXIMIZED;
if(config.resizable)
flags = flags | SDL_WINDOW_RESIZABLE;
mainWindow = SDL_CreateWindow(config.programName, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
config.windowWidth, config.windowHeight, flags);
SDL_GetWindowSize(mainWindow, (int*)&windowWidth, (int*)&windowHeight);
CHECK(mainWindow != NULL);
// CREATE OPENGL CONTEXT
mainContext = SDL_GL_CreateContext(mainWindow);
CHECK(mainContext != NULL);
// INIT GLEW
#ifdef _WIN32
CHECK(GLEW_OK == glewInit());
#endif
glEnable(GL_DEPTH_TEST);
glViewport(0,0,windowWidth,windowHeight);
glClearColor(0,0,0,1);
//glEnable(GL_PRIMITIVE_RESTART);
glEnable(GL_CULL_FACE);
//glPrimitiveRestartIndex(0xFFFFFFFF);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
TTF_Init();
- 确保您知道您的应用程序依赖于什么,并向平台提出要求。根据我的经验,说"核心档案"意义不大。更好地查询应用程序所需的每一个扩展,如果缺少什么,请关闭应用程序(在用户眼中优雅而友好)。扩展并不是一切。还要检查所有缓冲区的最大大小。其中我有真实的生活经验
- 永远不要依赖标准合规性。是的,标准规定GL_DEPTH最初被禁用。不,你永远不能相信司机遵守了这条规则。是的,那是真实的生活场景
- 对各种硬件进行适当的测试。供应商实施驱动程序的方式不同。有些人可能认为负顶点索引是完全可以的。有些人可能不会。那里的真实生活体验
- 永远不要接受无提示的OpenGL错误。"出了问题,可能没什么好担心的。对于这个硬件。对于这个驱动程序。对于这个版本。对于这个操作系统。也许吧。"
- 计算一下。浮点精度在OpenGL标准中没有那么严格(在OpenGL中更严格),对于具有未定义行为的操作(如除以零或任何基于NaN的操作)的行为,您永远不想依赖
- 阅读标准。是的,这是一种痛苦,但相信我,它会有回报的。你当然不会感觉到,因为你永远不会遇到你永远不会有的问题
顺便说一句,没有人真正遵循这种做法。每个人都先编码,然后永远调试。
相关文章:
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 当要求兼容性时,核心OpenGL上下文?
- GTKmm Opengl 上下文未初始化
- Electron中神秘无效的OpenGL上下文
- 是多个线程渲染到单个OpenGL上下文线程安全的线程
- 如何为 QtQuick 应用程序选择 OpenGL 上下文
- SetPixelFormat() 中的第三个参数对于 OpenGL 上下文创建有什么意义?
- 使用WGL创建现代OpenGL上下文
- 如何为第三方渲染提供空的QML项目的OpenGL上下文
- 用于在许多Qopenglwidget中显示的FBO渲染的全局OpenGL上下文
- 在 Mac OS X 10.9 中使用 GLFW 创建 OpenGL 3.3 上下文
- SDL_net没有创建OpenGL上下文
- 在运行时从OpenGL上下文切换到D3D/DX上下文(或其他上下文)
- 如何检查当前的 OpenGL 上下文是否在 Geforce 卡上运行
- GLFW无法在Mavericks上获取OpenGL 4.1上下文
- 如何使用SFML 2.2切换OpenGL上下文的线程
- 创建OpenGL 4.3上下文崩溃GLX
- SDL2要么丢失OpenGL上下文或未定义的函数
- OpenGL 上下文创建期间未记录的错误
- 在渲染以外的另一个线程中初始化 OpenGL 上下文