首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么帧缓冲区在Derelict3中冻结?

为什么帧缓冲区在Derelict3中冻结?
EN

Stack Overflow用户
提问于 2012-05-05 18:51:59
回答 1查看 357关注 0票数 1

我正在使用Derelict3,它使用特定的openGL3标准,如果调用glEnable(GL_DEPTH_TEST),我会遇到屏幕冻结(不更新)的问题,如果不调用,深度缓冲区将无法工作。我注意到,如果在设置SDL_GL上下文和重新加载Derelict3之前进行设置清晰颜色和启用深度测试的调用,则会忽略这些调用。我必须按以下顺序制作它们:

代码语言:javascript
复制
win=SDL_CreateWindow("3Doodle", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, w, h,     flags); 
if(!win){ 
       writefln("Error creating SDL window"); 
      SDL_Quit(); 
} 

context=SDL_GL_CreateContext(win); 
SDL_GL_SetSwapInterval(1); 

glVersion=DerelictGL3.reload(); 

glEnable(GL_DEPTH_TEST); 
glEnable(GL_CULL_FACE); 

glClearColor(0.0, 0.0, 0.0, 1.0); 
glClearDepth(1.0); 

glCullFace(GL_BACK); 
glFrontFace(GL_CCW);

虽然这在写入标准双缓冲区时对深度剔除进行了排序,但当我使用renderBuffer作为新的深度缓冲区实现一个帧缓冲区对象时,我得到了一个冻结...程序编译和运行时不会出现警告,但屏幕对齐四元组的渲染图像保持不变。如果我注释掉glEnable(GL_DEPTH_TEST);相机可以自由移动,但渲染的图像并不关心深度测试,而只是按顺序绘制对象。

帧缓冲区初始化代码为:

代码语言:javascript
复制
//fbo 
glEnable (GL_FRAMEBUFFER_SRGB); 
glGenFramebuffers(1, &fbo); 
assert(fbo > 0); 
glBindFramebuffer(GL_FRAMEBUFFER, fbo); 

glGenRenderbuffers(1, &rbo); 
assert(rbo > 0); 
glBindRenderbuffer(GL_RENDERBUFFER, rbo); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, projMat.w, projMat.h); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo); 
glBindRenderbuffer(GL_RENDERBUFFER, 0); 

glGenTextures(1, &fbon); 
assert(fbon > 0); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, fbon); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, projMat.w, projMat.h, 0, GL_RGBA,     GL_UNSIGNED_BYTE, null); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);    
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbon, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

 glGenTextures(1, &fboc); 
assert(fboc > 0); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, fboc); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, projMat.w, projMat.h, 0, GL_RGBA,     GL_UNSIGNED_BYTE, null); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);    
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, fboc, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

glGenTextures(1, &fbop); 
assert(fbop > 0); 
glActiveTexture(GL_TEXTURE2); 
glBindTexture(GL_TEXTURE_2D, fbop); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, projMat.w, projMat.h, 0, GL_RGBA,     GL_UNSIGNED_BYTE, null); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);    
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, fbop, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

int status=glCheckFramebufferStatus(GL_FRAMEBUFFER); 
assert(status == GL_FRAMEBUFFER_COMPLETE); 

buffs=[GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2]; 
glDrawBuffers(3, buffs.ptr); 
glBindFramebuffer(GL_FRAMEBUFFER, 0);

调用draw()中的fbo的代码是:

代码语言:javascript
复制
glBindFramebuffer(GL_FRAMEBUFFER, fbo); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glUseProgram(shad); 
glUniformMatrix4fv(viewLoc, 1, GL_TRUE, player.mat.ptr); 

current.draw(); 

glUseProgram(0); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

rend.draw();

我不知所措,因为同样的代码在c#中也能正常工作。

EN

回答 1

Stack Overflow用户

发布于 2012-05-07 17:23:37

我的愚蠢。忘记指定glDepthFunc

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10461123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档