我正在尝试在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进行上下文创建和窗口管理。
平台的一般规格我正在运行:
答案 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删除的功能
...
累积缓冲区 -
ClearAccum
和ACCUM_BUFFER_BIT
在Clear
的参数中无效(第4.2.3节);Accum
;描述累积缓冲区组件大小的ACCUM_*_-BITS
帧缓冲区状态;和所有相关的州。窗口系统绑定API(例如GLX和WGL)可以选择不公开包含累积缓冲区的窗口配置,或者在绑定到GL上下文的默认帧缓冲区包含它们时忽略累积缓冲区。