Opengl 使用GLFW的累积缓冲区
我必须在openGL项目(DOF渲染)中使用累积缓冲区,但它似乎不能与GLFW库一起工作。 我在一个圆上正确移动相机,拍摄21张“快照”(10张在左边,1张在正常位置,10张在右边),将所有快照添加到累积缓冲区(乘以1/21),当我在“正常”位置时,我显示缓冲区。但是,图像只是静止的、未渲染的,但渲染速度比以前慢21倍。 主回路是:Opengl 使用GLFW的累积缓冲区,opengl,buffer,glfw,Opengl,Buffer,Glfw,我必须在openGL项目(DOF渲染)中使用累积缓冲区,但它似乎不能与GLFW库一起工作。 我在一个圆上正确移动相机,拍摄21张“快照”(10张在左边,1张在正常位置,10张在右边),将所有快照添加到累积缓冲区(乘以1/21),当我在“正常”位置时,我显示缓冲区。但是,图像只是静止的、未渲染的,但渲染速度比以前慢21倍。 主回路是: int _tmain(int argc, _TCHAR* argv[]) { // GLFW initialisation if (!gl
int _tmain(int argc, _TCHAR* argv[]) {
// GLFW initialisation
if (!glfwInit()) {
return -1;
}
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_FALSE);
glfwWindowHint(GLFW_SAMPLES, 16);
GLFWwindow* window;
window = glfwCreateWindow( 800, 600, "DOF", NULL, NULL);
if ( !window ) {
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// check for errors
GLenum err = glGetError();
if( err ) {
fprintf( stderr, "ERROR: %s\n", glewGetErrorString( err ) );
exit(EXIT_FAILURE);
}
// GLEW init
glewExperimental = GL_TRUE;
GLenum GlewInitResult;
GlewInitResult = glewInit();
if (GLEW_OK != GlewInitResult) {
fprintf( stderr, "ERROR: %s\n", glewGetErrorString(GlewInitResult));
exit(EXIT_FAILURE);
}
// main loop
Game game;
game.Init();
Keyboard::KeyboardInit();
glEnable(GL_DEPTH_TEST);
glClear(GL_ACCUM_BUFFER_BIT);
while (!glfwWindowShouldClose(window))
{
glAccum(GL_ACCUM, 1 / (game.getSteps() * 2 + 1)); // steps = 10
game.nextStep(); //increments step by one
game.Update();
game.Redraw();
if (game.getStep() == 1) {
glAccum(GL_RETURN, 1);
glfwSwapBuffers(window);
}
glfwPollEvents();
calcFPS(2.0, "DOF", window);
}
glfwTerminate();
return 0;
}
请注意,累积缓冲区是过去的东西,在大多数具有现代OpenGL配置文件的消费卡上不会被加速;它更有可能得到专业等级卡的支持 无论如何,您必须请求一个累积缓冲区才能获得一个。但是,您需要一个OpenGL-3.3核心概要文件,这为您提供了比累积缓冲区更好的东西:帧缓冲区对象。这些都得到了广泛的支持(如果使用FBO扩展,甚至可以追溯到2000年以前的非常旧的硬件),并允许更大的灵活性 通常的做法是:
glBlendFunc(GL_SRC_ALPHA,GL_ONE)
混合到具有HDR格式(GL_RGB16或类似格式)且ALPHA值为1/n,n为累积步数的累积纹理中绘制此纹理for step in DOF:
glBindFramebuffer(scenedraw_FBO)
draw_scene()
glBindFramebuffer(accumulation_FBO)
glBindTexture(…, scenedraw_texture)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE)
glColor4f(1.,1.,1., 1./(float)count(DOF) )
draw_fullscreen_textured_quad()
glBindTexture(…, 0)
除了使用alpha值进行缩放,还可以使用浮点纹理格式并使用
glBlendFunc(GL\u ONE,GL\u ONE)
混合。但是,浮动纹理没有得到广泛支持。请注意,累积缓冲区是过去的东西,在大多数具有现代OpenGL配置文件的消费卡上不会加速;它更有可能得到专业等级卡的支持
无论如何,您必须请求一个累积缓冲区才能获得一个。但是,您需要一个OpenGL-3.3核心概要文件,这为您提供了比累积缓冲区更好的东西:帧缓冲区对象。这些都得到了广泛的支持(如果使用FBO扩展,甚至可以追溯到2000年以前的非常旧的硬件),并允许更大的灵活性
通常的做法是:
glBlendFunc(GL_SRC_ALPHA,GL_ONE)
混合到具有HDR格式(GL_RGB16或类似格式)且ALPHA值为1/n,n为累积步数的累积纹理中绘制此纹理for step in DOF:
glBindFramebuffer(scenedraw_FBO)
draw_scene()
glBindFramebuffer(accumulation_FBO)
glBindTexture(…, scenedraw_texture)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE)
glColor4f(1.,1.,1., 1./(float)count(DOF) )
draw_fullscreen_textured_quad()
glBindTexture(…, 0)
除了使用alpha值进行缩放,还可以使用浮点纹理格式并使用
glBlendFunc(GL\u ONE,GL\u ONE)
混合。但是,浮动纹理没有得到广泛支持。请注意,累积缓冲区是过去的东西,在大多数具有现代OpenGL配置文件的消费卡上不会加速;它更有可能得到专业等级卡的支持
无论如何,您必须请求一个累积缓冲区才能获得一个。但是,您需要一个OpenGL-3.3核心概要文件,这为您提供了比累积缓冲区更好的东西:帧缓冲区对象。这些都得到了广泛的支持(如果使用FBO扩展,甚至可以追溯到2000年以前的非常旧的硬件),并允许更大的灵活性
通常的做法是:
glBlendFunc(GL_SRC_ALPHA,GL_ONE)
混合到具有HDR格式(GL_RGB16或类似格式)且ALPHA值为1/n,n为累积步数的累积纹理中绘制此纹理for step in DOF:
glBindFramebuffer(scenedraw_FBO)
draw_scene()
glBindFramebuffer(accumulation_FBO)
glBindTexture(…, scenedraw_texture)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE)
glColor4f(1.,1.,1., 1./(float)count(DOF) )
draw_fullscreen_textured_quad()
glBindTexture(…, 0)
除了使用alpha值进行缩放,还可以使用浮点纹理格式并使用
glBlendFunc(GL\u ONE,GL\u ONE)
混合。但是,浮动纹理没有得到广泛支持。请注意,累积缓冲区是过去的东西,在大多数具有现代OpenGL配置文件的消费卡上不会加速;它更有可能得到专业等级卡的支持
无论如何,您必须请求一个累积缓冲区才能获得一个。但是,您需要一个OpenGL-3.3核心概要文件,这为您提供了比累积缓冲区更好的东西:帧缓冲区对象。这些都得到了广泛的支持(如果使用FBO扩展,甚至可以追溯到2000年以前的非常旧的硬件),并允许更大的灵活性
通常的做法是:
glBlendFunc(GL_SRC_ALPHA,GL_ONE)
混合到具有HDR格式(GL_RGB16或类似格式)且ALPHA值为1/n,n为累积步数的累积纹理中绘制此纹理for step in DOF:
glBindFramebuffer(scenedraw_FBO)
draw_scene()
glBindFramebuffer(accumulation_FBO)
glBindTexture(…, scenedraw_texture)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE)
glColor4f(1.,1.,1., 1./(float)count(DOF) )
draw_fullscreen_textured_quad()
glBindTexture(…, 0)
除了使用alpha值进行缩放,还可以使用浮点纹理格式并使用
glBlendFunc(GL\u ONE,GL\u ONE)
混合。不过,浮动纹理并没有得到广泛支持。您确实忽略了在像素格式中请求任何累积缓冲位。尽管这很可能无关紧要,因为如果枚举所有像素格式,在某些平台上,累积缓冲区总是非零的。这里真正重要的是您有一个核心配置文件,它不支持累积缓冲区。大概你能做的最好的事情就是使用你目前使用的16x MSAA(顺便说一下,很多GPU都不支持它)来存储7个左图像,1个中间图像和7个右图像。你确实忽略了以像素格式请求任何累积缓冲位。尽管这很可能无关紧要,因为如果枚举所有像素格式,在某些平台上,累积缓冲区总是非零的。这里真正重要的是您有一个核心配置文件,它不支持累积缓冲区。关于最好的你