如何确定支持的多重采样样本的最大数量

时间:2014-07-14 14:16:20

标签: opengl sdl antialiasing sdl-2

我正在将SDL 2用于基于OpenGL的应用程序,我目前正在使用以下代码实现抗锯齿:

SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, samples);

但是我不想硬编码反消除级别,所以我想让用户从有效值列表中选择值。问题是我不知道如何找出用户机器上支持的值。在我的游戏机上,我可以选择最大值16,但在我的笔记本电脑上我只能选择4.任何更高的设置都会触发错误消息Couldn't find matching GLX visual

那么如何找出我可以用于SDL_GL_MULTISAMPLESAMPLES属性的最大值?

3 个答案:

答案 0 :(得分:2)

由于多重采样是像素格式属性,我认为没有办法从OpenGL查询它。您可能需要在特定操作级别上执行此操作,但我不确定如何使用SDL。

答案 1 :(得分:2)

这是一个4年前的问题,但万一人们来到这里: 有一种方法可以获得这些信息。您必须使用glGetIntegerv ( GL_MAX_SAMPLES, &maxSamples );,但不幸的是,您只能在创建窗口后执行此操作。所以你必须创建一个没有多重采样的临时窗口,从openGL获取所有必需的信息,然后关闭这个窗口并创建真实的窗口。

如果要将此临时窗口创建隐藏到用户,可以使用SDL_WINDOW_HIDDEN标志创建它。 A"加载屏幕"也可以做到这一点:

  • 打开"加载应用程序数据......"屏幕不需要抗锯齿。
  • 用它来调用glGetIntegerv和其他类似的东西。
  • 加载您的应用程序数据,纹理......
  • 关闭此窗口并使用抗锯齿打开最后一个窗口。 :)

答案 2 :(得分:0)

请问(wglChoosePixelFormatARB | glXChooseVisual)! 如果他们不支持你想要的样本数,他们就不会返回像素格式。

        const int piAttribIList[] =
    {
        WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
        WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
        WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
        WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
        WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB,
        WGL_COLOR_BITS_ARB, 32,
        WGL_DEPTH_BITS_ARB, 24,
        WGL_STENCIL_BITS_ARB, 8,
        WGL_SAMPLE_BUFFERS_ARB, 1,
        WGL_SAMPLES_EXT, 4,
        0 // zero term
    };
    const float pfAttribFList[] = { 0.0f };

    int piFormats;
    unsigned int nNumFormats;
    assert(wglChoosePixelFormatARB(m_Ptr->m_hDC, piAttribIList, pfAttribFList, 1, &piFormats, &nNumFormats));

如果nNumFormats是> 0然后支持WGL_SAMPLES_EXT,4

如果nNUmFOrmats为0,则不支持WGL_SAMPLES_EXT == 4

无需创建虚假上下文

在我的opengl上,最新的nvidia drvier。 glGetIntegerv(GL_MAX_SAMPLES,& maxSamples);给了我32 但我不能用32 mutlisample创建一个上下文,对于offscreenframebuffers来说,32也是如此。