2013-03-11 157 views
2

我試圖寫一個簡單的OpenGL 3.2(含GLSL 1.5)使用的是Mac OS X(殷海濤獅子)GLUT的程序,但我一直從glValidateProgram收到錯誤:的OpenGL glValidateProgram錯誤

「驗證失敗:當前繪製幀緩衝區無效。'

什麼可能導致此錯誤發生?

+1

這聽起來很不禮貌,但是......一個無效的畫幀緩衝是導致這種情況發生的原因。你有沒有改變它?目前是什麼? – 2013-03-11 10:16:56

+1

尼科爾像往常一樣。此外,glCheckFramebufferStatus可能是您最好的朋友。 – Robinson 2013-03-11 10:22:29

+1

glCheckFramebuffertatus返回GL_FRAMEBUFFER_UNDEFINED,根據OpenGL參考手段表示: 「如果target是默認幀緩衝區,但默認幀緩衝區不存在,則返回」。 什麼可以定義默認的幀緩衝區? – user2156225 2013-03-12 19:19:07

回答

1

與OP一樣,我遇到了一些使用此代碼的代碼,並且在不瞭解任何更好的情況下,我在程序鏈接步驟之後立即執行它。得到了同樣的錯誤。

我不是這裏的專家,但基於一些觀察我認爲我會澄清@robinjam似乎在說什麼(這與GL文檔中關於glValidateProgram的說法相呼應)。

我使用的示例代碼是Apple的iOS測試OpenGL ES 2.0演示項目,並且我還沒有在設備上運行這段確切的代碼,但是模擬器給我提供了這個Validation Failed: Current draw framebuffer is invalid.錯誤。但是,請注意,運行此的方法- (BOOL)validateProgram:(GLuint)prog包含在ViewController.mm(不是.m,因爲早期我已用C++感染它),但沒有提供此示例代碼的代碼,實際上它將其稱爲

所以glValidateProgram的目的不是爲了使用它作爲鏈接程序後增加了「檢查」的步驟,因爲GL和應用程序狀態是很難準備實際使用該程序在這一點上,也許甚至之前的我們開始初始化默認幀緩衝區(它的bitdepth,它的多重緩衝區等),這就是錯誤提示。

調用glValidateProgram的適當位置就在您進行真正的渲染調用之前。

這對調試很有用。當出現問題時,我們可以選擇讓司機幫助我們解決問題。每當我們在非調試情況下渲染一切正常時,就會調用這個函數很愚蠢。

0

如果這有幫助,下面的代碼將創建一個有效的幀緩衝區,用於寫入與默認屏幕渲染緩衝區不同的幀,寫入它並重置屏幕緩衝區。

// ************************************** Save the Current Viewport Size 

GLint screenViewPort[4]; 
glGetIntegerv(GL_VIEWPORT, screenViewPort); 

// ***************************** Define a Second Output Buffer and Bind it for Writing 

glGenFramebuffersEXT(1, wispSecondOutputBuffer); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, wispSecondOutputBuffer[0]); 

// ******************************* Set the Viewport to the Texture Size and Reshape 

glViewport(0,0,TEXTUREWIDTH, TEXTUREHEIGHT); 
[self resizeTextureGL]; // Calculates new Model, View and Projection Matrices 

// ************************************** Create the Output Imgage Texture 

glGenTextures(1, wispOutputTexture); 
glBindTexture(GL_TEXTURE_2D, wispOutputTexture[0]); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)TEXTUREWIDTH, (GLsizei)TEXTUREHEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

// ********************************* Attach the Output Texture to the Frame Buffer 

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, wispOutputTexture[0], 0); 

GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; 
glDrawBuffers(1, DrawBuffers); 

// ************************************ Check that the Frame Buffer is Complete 

GLenum frameBufferStatus; 

frameBufferStatus = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); 

if(frameBufferStatus != GL_FRAMEBUFFER_COMPLETE_EXT) NSLog(@"There is a problem with the output frame buffer"); 

// ****************************************** Render to the Texture 

[self runTextureShaders]; 
[self runTextureShaders2]; 

// ************************************ Reset the Viewport and Frame Buffer 

glViewport(screenViewPort[0],screenViewPort[1],(GLsizei)screenViewPort[2], (GLsizei)screenViewPort[3]); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
0

這是個老問題。

當我在iOS中使用GLKView和GLKViewcontroller時,嘗試在viewDidLoad中進行驗證會導致此錯誤。

當幀緩衝區準備就緒時,在ViewDidAppear中執行此操作。