OpenGL累积缓冲区无法正常工作

时间:2015-11-26 08:23:30

标签: c++ opengl sdl glew

我正在尝试在OpenGL中使用累积缓冲区,但由于某种原因,缓冲区似乎没有填充。我构建了一个简单的测试应用程序,一个2D平面被渲染,没有别的。这很好。 然后我尝试做我能想到的最简单的累积缓冲操作,将渲染帧加载到累积缓冲区,清除屏幕然后将累积缓冲区返回到屏幕。 当我这样做时,看起来累积缓冲区根本不包含任何信息,图像只是屏幕被清除的颜色,就好像累积缓冲区根本就没有返回。我还尝试过做一个更传统的运动模糊设置,在返回之前对场景和缓冲区进行多次更新,并获得相同的结果。

这是简单测试的主要循环:

var date = <?php echo $date; ?>;

这是运动模糊测试的主要循环:

SDL_Event eve;
while (true)
{
    //Normal stuff
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

    //Accumulation///////////////////////
    glAccum(GL_LOAD, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glAccum(GL_RETURN, 1.0f);
    //Accumulation///////////////////////

    SDL_GL_SwapWindow(window);

    SDL_PollEvent(&eve);
}

这是完整的应用程序源代码(它只有大约100行,我只是包含它,只是因为我的float x = 0.0f; int step = 0; int steps = 4; SDL_Event eve; while (true) { //Test stuff x += 0.005f; GLfloat newVerts[] = { -0.5f + x, 0.5f, 0.5f + x, 0.5f, 0.5f + x, -0.5f, -0.5f + x, -0.5f, }; glBufferData(GL_ARRAY_BUFFER, sizeof(newVerts), newVerts, GL_STATIC_DRAW); //Normal stuff glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); //Accumulation/////////////////////// if (step == 0) { glAccum(GL_LOAD, 1.0f / steps); } else { glAccum(GL_ACCUM, 1.0f / steps); } step++; if (step < steps) { continue; } step = 0; glAccum(GL_RETURN, 1.0f); //Accumulation/////////////////////// SDL_GL_SwapWindow(window); SDL_PollEvent(&eve); } glEnable来电有问题:

SDL_GL_SetAttribute

我正在使用GLEW来访问OpenGL调用,而我正在使用SDL进行上下文创建和窗口管理。

平台的一般规格我正在运行:

  • OpenGL 4.5(也尝试过4.3和3.3,没有区别)。
  • Windows 10 64位
  • AMD FX-9590 @ 4.7 GHz
  • NVIDIA GTX 970 SC
  • 华硕Sabertooth 990FX
  • 16GB DDR3内存

1 个答案:

答案 0 :(得分:3)

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^

删除的功能(如累积缓冲区)在Core上下文中不起作用。

OpenGL 3.2 Core spec, appendix E, page 329 & 333:

  

E.2已弃用和已删除的功能

     

...

     

已删除的功能会生成INVALID_OPERATION   如果在核心配置文件中或在向前兼容的上下文中调用,则会出错。

     

...

     

E.2.2删除的功能

     

...

     

累积缓冲区 - ClearAccumACCUM_BUFFER_BITClear的参数中无效(第4.2.3节); Accum;描述累积缓冲区组件大小的ACCUM_*_-BITS帧缓冲区状态;和所有相关的州。

     

窗口系统绑定API(例如GLX和WGL)可以选择不公开包含累积缓冲区的窗口配置,或者在绑定到GL上下文的默认帧缓冲区包含它们时忽略累积缓冲区。