我試圖寫一個簡單的OpenGL 3.2(含GLSL 1.5)使用的是Mac OS X(殷海濤獅子)GLUT的程序,但我一直從glValidateProgram收到錯誤:的OpenGL glValidateProgram錯誤
「驗證失敗:當前繪製幀緩衝區無效。'
什麼可能導致此錯誤發生?
我試圖寫一個簡單的OpenGL 3.2(含GLSL 1.5)使用的是Mac OS X(殷海濤獅子)GLUT的程序,但我一直從glValidateProgram收到錯誤:的OpenGL glValidateProgram錯誤
「驗證失敗:當前繪製幀緩衝區無效。'
什麼可能導致此錯誤發生?
與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的適當位置就在您進行真正的渲染調用之前。
這對調試很有用。當出現問題時,我們可以選擇讓司機幫助我們解決問題。每當我們在非調試情況下渲染一切正常時,就會調用這個函數很愚蠢。
如果這有幫助,下面的代碼將創建一個有效的幀緩衝區,用於寫入與默認屏幕渲染緩衝區不同的幀,寫入它並重置屏幕緩衝區。
// ************************************** 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);
這是個老問題。
當我在iOS中使用GLKView和GLKViewcontroller時,嘗試在viewDidLoad中進行驗證會導致此錯誤。
當幀緩衝區準備就緒時,在ViewDidAppear中執行此操作。
這聽起來很不禮貌,但是......一個無效的畫幀緩衝是導致這種情況發生的原因。你有沒有改變它?目前是什麼? – 2013-03-11 10:16:56
尼科爾像往常一樣。此外,glCheckFramebufferStatus可能是您最好的朋友。 – Robinson 2013-03-11 10:22:29
glCheckFramebuffertatus返回GL_FRAMEBUFFER_UNDEFINED,根據OpenGL參考手段表示: 「如果target是默認幀緩衝區,但默認幀緩衝區不存在,則返回」。 什麼可以定義默認的幀緩衝區? – user2156225 2013-03-12 19:19:07