2013-03-11 2 views
2

Я пытаюсь написать простой OpenGL 3.2 (с GLSL 1.5) программы с использованием GLUT на Mac OS X (Mountian Lion), но я получаю сообщение об ошибке от glValidateProgram:OpenGL glValidateProgram ошибка на Mac OS X

«Validation Ошибка: текущий фрейм-фрейм кадра недействителен. '

Что может вызвать эту ошибку?

+1

Это будет звучать легкомысленно, но ... недопустимый фрейм-буффер рисования - вот почему это происходит. Вы изменили его? Что это такое? –

+1

Николь прав, как обычно. Кроме того, glCheckFramebufferStatus может быть вашим лучшим другом здесь. – Robinson

+1

glCheckFramebuffertatus возвращает GL_FRAMEBUFFER_UNDEFINED, который в соответствии с ссылкой на OpenGL означает: "возвращается, если цель является фреймбуфером по умолчанию, но фреймбуфер по умолчанию не существует." Что я могу определить фреймбуфер по умолчанию? – user2156225

ответ

1

Как и в OP, я столкнулся с некоторым кодом, который использует это, и, не зная ничего лучшего, я реализовал его сразу же после этапа ссылки на программу. Получена такая же ошибка.

Я не эксперт здесь, но, основываясь на нескольких наблюдениях, я подумал, что уточню, что, по-видимому, говорит @robinjam (что повторяет то, что говорят GL docs около glValidateProgram).

Образец кода, который я использовал, был демонстрационным проектом Apple iOS OpenGL ES 2.0, и я еще не запускал эту точную часть кода на устройстве, но Simulator дает мне эту ошибку Validation Failed: Current draw framebuffer is invalid.. Тем не менее, важно отметить, что метод, который работает с этим, - (BOOL)validateProgram:(GLuint)prog, включен в ViewController.mm (а не .m, потому что я заразил его с помощью C++ на ранней стадии), но не содержит кода, снабженного этим примером кода, который фактически называет его.

Поэтому цель glValidateProgram не использовать его в качестве дополнительного «проверки» шаг после компоновки программы, так как GL и состояние приложения вряд ли готовы к фактически с помощью, что программа в данный момент, вероятно, это еще до того, мы начинаем инициализировать фреймбуфер по умолчанию (его битдап, его мультисэмпл буферы и т. д.), и это то, о чем подсказывает ошибка.

Соответствующее место для вызова 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

Это старый вопрос.

Когда я использую GLKView и GLKViewcontroller в iOS, попытка проверки в viewDidLoad делает эту ошибку.

Сделайте это в ViewDidAppear, когда фреймбуфер готов.