我在一个原有的OpenGL程序里面,想制加入物体的辉光效果,于是加入了FrameBufferObject,但是运行程序以后,除了按钮,其他地方都是黑的。
请大家帮我看看这些关于FBO的程序,是不是影响到了原来主程序中的mainFrameBuffer? 谢谢了。1.下面是原主程序中, Draw函数里面开始调用FBO 的代码:
GLenum err = glewInit() ;
if (GLEW_OK != err)
{
MessageBoxA(NULL, "error", "My Window", 1) ;
}
glPushAttrib(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport( 0, 0, 1024, 768);glow.init(); //代码在下面
glow.begin(); //代码在下面
glPushMatrix(); // 绘制的一个球,打算让他有发光的效果
glTranslatef(0.0, 0.0, 0.0);// 绘制的一个球,打算让他有发光的效果
glutSolidSphere(5, 32, 32);// 绘制的一个球,打算让他有发光的效果
glPopMatrix();// 绘制的一个球,打算让他有发光的效果
glow.end(); //代码在下面
glPopAttrib();
2.glow.init();
initShaders(); //这和函数读调用了Shader的一些文件,用于制作物体的模糊。 fbo = new FrameBufferObject(); /************************************************************************/
/* TEXTURE CREATION */
/************************************************************************/
glGenTextures(1, &originalTexture);
glGenTextures(1, &brightPassTex);
glGenTextures(1, &horizBlurredTex);
glGenTextures(1, &finalBlurredTex); glGenTextures(1, &depthBufferId); // initialize depth buffer
glBindTexture(GL_TEXTURE_2D, depthBufferId);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, imageWinWidth, imageWinHeight, 0,
GL_DEPTH_COMPONENT, GL_FLOAT, NULL); fbo->bind();
glPushAttrib(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport( 0, 0, 1024, 768); // initialize texture that will store the framebuffer image
glBindTexture(GL_TEXTURE_2D, originalTexture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWinWidth, imageWinHeight, 0,
GL_RGBA, GL_FLOAT, NULL); glBindTexture(GL_TEXTURE_2D, brightPassTex);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWinWidth, imageWinHeight, 0,
GL_RGBA, GL_FLOAT, NULL); glGenerateMipmapEXT(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, horizBlurredTex);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWinWidth, imageWinHeight, 0,
GL_RGBA, GL_FLOAT, NULL); glGenerateMipmapEXT(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, finalBlurredTex);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWinWidth, imageWinHeight, 0,
GL_RGBA, GL_FLOAT, NULL); glGenerateMipmapEXT(GL_TEXTURE_2D); fbo->attachTexture(originalTexture, GL_COLOR_ATTACHMENT0_EXT, 0);
fbo->attachTexture(brightPassTex, GL_COLOR_ATTACHMENT1_EXT, 0);
fbo->attachTexture(horizBlurredTex, GL_COLOR_ATTACHMENT2_EXT, 0);
fbo->attachTexture(finalBlurredTex, GL_COLOR_ATTACHMENT3_EXT, 0); fbo->attachDepthBuffer( depthBufferId ); glPopAttrib();
FrameBufferObject::unbind();
3.glow.begin();
fbo->bind(); glDrawBuffer( GL_COLOR_ATTACHMENT0_EXT ); // #### FIRST STEP: Draw the object into the original texture: 'originalTexture'
glClearColor(0.0f, 0.0f, 0.0f, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
4.glow.end();
glDrawBuffer( GL_COLOR_ATTACHMENT1_EXT ); // Don't forget to clean the COLOR/DEPTH buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // render using the horizontal blur shader and the original texture
brightPassShaderProgram->useProgram();
renderSceneOnQuad( originalTexture, GL_TEXTURE0);
brightPassShaderProgram->disableProgram(); /************************************************************************/
/* TEMP!!!! */
/************************************************************************/
glBindTexture(GL_TEXTURE_2D, brightPassTex);
glGenerateMipmapEXT(GL_TEXTURE_2D); blurToMipmaps(GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT, 6.0f, 0.03f);
blurToMipmaps(GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT1_EXT, 3.0f, 0.005f); /************************************************************************/
/* */
/************************************************************************/
glDrawBuffer( GL_COLOR_ATTACHMENT2_EXT ); // ******* RENDER TO THE WINDOW ************* glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); blenderShaderProgram->useProgram();
blendTextures(brightPassTex, finalBlurredTex);
blenderShaderProgram->disableProgram(); /************************************************************************/
/* */
/************************************************************************/ // 'unbind' the FBO. things will now be drawn to screen as usual
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // ******* RENDER TO THE WINDOW ************* glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //************************************************************************/
//* SHOULD FIND OUT THIS WELL !!!! */
//************************************************************************/
glColor3f(1.0, 1.0, 1.0); //glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
blenderShaderProgram->useProgram();
//renderSceneOnQuad( horizBlurredTex, GL_TEXTURE0 );
blendTextures(originalTexture, horizBlurredTex);
blenderShaderProgram->disableProgram();
另:加入FBO后,运行程序的效果如下。
背景都成黑的了。
请大家帮我看看这些关于FBO的程序,是不是影响到了原来主程序中的mainFrameBuffer? 谢谢了。1.下面是原主程序中, Draw函数里面开始调用FBO 的代码:
GLenum err = glewInit() ;
if (GLEW_OK != err)
{
MessageBoxA(NULL, "error", "My Window", 1) ;
}
glPushAttrib(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport( 0, 0, 1024, 768);glow.init(); //代码在下面
glow.begin(); //代码在下面
glPushMatrix(); // 绘制的一个球,打算让他有发光的效果
glTranslatef(0.0, 0.0, 0.0);// 绘制的一个球,打算让他有发光的效果
glutSolidSphere(5, 32, 32);// 绘制的一个球,打算让他有发光的效果
glPopMatrix();// 绘制的一个球,打算让他有发光的效果
glow.end(); //代码在下面
glPopAttrib();
2.glow.init();
initShaders(); //这和函数读调用了Shader的一些文件,用于制作物体的模糊。 fbo = new FrameBufferObject(); /************************************************************************/
/* TEXTURE CREATION */
/************************************************************************/
glGenTextures(1, &originalTexture);
glGenTextures(1, &brightPassTex);
glGenTextures(1, &horizBlurredTex);
glGenTextures(1, &finalBlurredTex); glGenTextures(1, &depthBufferId); // initialize depth buffer
glBindTexture(GL_TEXTURE_2D, depthBufferId);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, imageWinWidth, imageWinHeight, 0,
GL_DEPTH_COMPONENT, GL_FLOAT, NULL); fbo->bind();
glPushAttrib(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport( 0, 0, 1024, 768); // initialize texture that will store the framebuffer image
glBindTexture(GL_TEXTURE_2D, originalTexture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWinWidth, imageWinHeight, 0,
GL_RGBA, GL_FLOAT, NULL); glBindTexture(GL_TEXTURE_2D, brightPassTex);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWinWidth, imageWinHeight, 0,
GL_RGBA, GL_FLOAT, NULL); glGenerateMipmapEXT(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, horizBlurredTex);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWinWidth, imageWinHeight, 0,
GL_RGBA, GL_FLOAT, NULL); glGenerateMipmapEXT(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, finalBlurredTex);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWinWidth, imageWinHeight, 0,
GL_RGBA, GL_FLOAT, NULL); glGenerateMipmapEXT(GL_TEXTURE_2D); fbo->attachTexture(originalTexture, GL_COLOR_ATTACHMENT0_EXT, 0);
fbo->attachTexture(brightPassTex, GL_COLOR_ATTACHMENT1_EXT, 0);
fbo->attachTexture(horizBlurredTex, GL_COLOR_ATTACHMENT2_EXT, 0);
fbo->attachTexture(finalBlurredTex, GL_COLOR_ATTACHMENT3_EXT, 0); fbo->attachDepthBuffer( depthBufferId ); glPopAttrib();
FrameBufferObject::unbind();
3.glow.begin();
fbo->bind(); glDrawBuffer( GL_COLOR_ATTACHMENT0_EXT ); // #### FIRST STEP: Draw the object into the original texture: 'originalTexture'
glClearColor(0.0f, 0.0f, 0.0f, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
4.glow.end();
glDrawBuffer( GL_COLOR_ATTACHMENT1_EXT ); // Don't forget to clean the COLOR/DEPTH buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // render using the horizontal blur shader and the original texture
brightPassShaderProgram->useProgram();
renderSceneOnQuad( originalTexture, GL_TEXTURE0);
brightPassShaderProgram->disableProgram(); /************************************************************************/
/* TEMP!!!! */
/************************************************************************/
glBindTexture(GL_TEXTURE_2D, brightPassTex);
glGenerateMipmapEXT(GL_TEXTURE_2D); blurToMipmaps(GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT, 6.0f, 0.03f);
blurToMipmaps(GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT1_EXT, 3.0f, 0.005f); /************************************************************************/
/* */
/************************************************************************/
glDrawBuffer( GL_COLOR_ATTACHMENT2_EXT ); // ******* RENDER TO THE WINDOW ************* glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); blenderShaderProgram->useProgram();
blendTextures(brightPassTex, finalBlurredTex);
blenderShaderProgram->disableProgram(); /************************************************************************/
/* */
/************************************************************************/ // 'unbind' the FBO. things will now be drawn to screen as usual
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // ******* RENDER TO THE WINDOW ************* glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //************************************************************************/
//* SHOULD FIND OUT THIS WELL !!!! */
//************************************************************************/
glColor3f(1.0, 1.0, 1.0); //glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
blenderShaderProgram->useProgram();
//renderSceneOnQuad( horizBlurredTex, GL_TEXTURE0 );
blendTextures(originalTexture, horizBlurredTex);
blenderShaderProgram->disableProgram();
另:加入FBO后,运行程序的效果如下。
背景都成黑的了。
解决方案 »
- P2P聊天软件问题
- shellExecute 调用一个又返回函数的命令,如何取得它的返回值
- 如何让CSplitterWnd拆分后的子窗口还带有标题栏?
- 为什么无法设置断点?提示信息:One Or More Breakpoints cannot be set and have been disabled.execution will stop at the beginning
- 在VC中,一条浮点乘的指令相当于多少条浮点加的指令?
- 大家帮我看看这个错误?
- 如果将 Win98 注册表中 Run 子键中的自动运行项目 Taskmon.exe 和 Systray.exe 删除,对系统有无影响?
- @@@@30秒扫描我ftp断口21共900次,他想干些什么啊???能干些什么啊???希望知道。。。。
- 各位帮忙给个思路:怎么判断当前ie 中的flash 视频播放的开始和结束
- 我已经弄了三天了,实在找不出错误,求帮忙!
- 将内存中的一个区域转换为结构体
- 求个VS2010 VC单独安装包的下载地址
我加入FBO,主要是因为我想在球场里面加入一个自发光的球体,模拟灯泡。
现在把自发光球体的代码写进去就出问题了。这个自发光球体是基于FBO 和 GLSL 的。
我在一个单独的程序里面实现了发光的球体,是基于FBO 和 GLSL 的。
在这个程序里面有很多次的:
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);每次的清空场景,都是为了后面生成新的图片。
如果去掉glClearColor,那个自发光体也显示不出来了。