2016-08-26 6 views
0

Я не могу отобразить простой движущийся треугольник на экране, и это происходит только тогда, когда я вызываю свою функцию с помощью glutDisplayFunc (render). Если я вызываю свою функцию как обычный вызов render(), он хорошо отображает треугольник, но в этом случае он не анимирует мой треугольник.glutDisplayFunc() не рисует, но нормальный вызов функции

Так в основном у меня есть два вопроса:

  1. не может нарисовать треугольник, когда вызов функции с glutDisplayFunc (рендеринга)
  2. не может анимировать треугольник при вызове функции, как рендеринга(), но он может нарисовать треугольник хоть.

ниже мой основной и дисплей код:

void render() 
{ 

currentTime = glutGet(GLUT_ELAPSED_TIME); 
glClear(GL_COLOR_BUFFER_BIT); 

GLfloat color[] = { (float)sin(currentTime) * 0.5f + 0.5f, (float)cos(currentTime) * 0.5f + 0.5f, 0.0f, 1.0f }; 

glClearBufferfv(GL_COLOR, 0, color); 

GLfloat attrib[] = { (float)sin(currentTime) * 0.5f, (float)cos(currentTime) * 0.6f, 0.0f, 0.0f }; 

glVertexAttrib4fv(0, attrib); 
// Use the program object we created earlier for rendering 

glUseProgram(rendering_program); 

//Draw triangle 
glDrawArrays(GL_TRIANGLES,0,3); 

glutSwapBuffers(); 

} 

Главная:

int main(int argc, char** argv) 
{ 

glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_RGBA); 
glutInitWindowSize(600,600); 
glutInitContextVersion(4,3); 
glutInitContextProfile(GLUT_CORE_PROFILE); 
glutCreateWindow("Shader"); 

if (glewInit()) { 
cerr << "Unable to initialize GLEW ... exiting" << endl; 
exit(EXIT_FAILURE); 
} 

startup(); 
// render();  // WORKS FINE AND DRAW TRIANGLE 
glutDisplayFunc(render); //DOESN'T DRAW TRIANGLE 
shutdown(); 

glutMainLoop(); 
return 0; 

} 

Я считаю, что шейдеры компилируются хорошо и нет никакой ошибки в той части кода, потому что он рисует треугольник без glutDisplayFunc(); и единственная проблема заключается в том, что я использую glutDisplayFunc (render); ничего не нарисовано.

Куда я иду не так? И как я могу исправить два вопроса, упомянутых выше?

+1

Вы знаете, что вы вызываете 'shutdown()' перед вводом 'glutMainLoop()', правильно? Нет абсолютно никакой причины, по которой обратный вызов не должен вызываться с кодом, который вы нам показываете, и я уверен, что если вы установите точку останова в 'render()', отладчик будет работать в этом хотя бы один раз, если, конечно, вы отмените обратный вызов снова в 'shutdown()' ... – thokra

+0

omg Я даже не осознавал этого. ! Он работает сейчас. Спасибо, что объяснили. –

ответ

2

glutDisplayFunc не делает себя. Он регистрирует функцию, которая должна использоваться перенасыщением при выполнении рендеринга. Вызов ifsef происходит где-то внутри glutMainLoop(). Поскольку вы завершаете все перед запуском процесса рендеринга, данные недоступны, когда система пытается отобразить.

+0

Вы объяснили это очень хорошо. Я полностью понял, почему у меня был этот вопрос сейчас. Спасибо за ваш быстрый ответ, что он работает сейчас :) –