2012-05-05 129 views
1

我正在使用Derelict3,它使用特定的openGL3標準,如果glEnable(GL_DEPTH_TEST)被調用,我遇到了屏幕凍結(不更新)的問題,如果不是,深度緩衝區不工作。我注意到,設置清除顏色和啓用深度測試的調用在設置SDL_GL上下文並重新加載Derelict3之前被忽略。我不得不讓他們按以下順序:framebuffer爲什麼會在Derelict3中凍結?

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); 

雖然整理出了這深度剔除,而寫入標準雙緩衝,當我實現了渲染一幀緩衝區對象作爲新的深度緩衝,我收到了凍結。 ..程序編譯並運行時沒有警告,但渲染的圖像與屏幕對齊的四邊形保持不變。如果我註釋掉glEnable(GL_DEPTH_TEST);相機可以自由移動,但渲染後的圖像不需要進行深度測試,只需按順序繪製對象即可。

幀緩衝器初始化代碼:

//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); 

調用平局的FBO()的代碼是:

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#中的工作,因爲它應該。

+0

您是否嘗試過調用'glGetError()'來查看是否有任何東西在OpenGL上出錯了? –

回答

2

我的愚蠢。忘了指定glDepthFunc