Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Проблема с glLoadIdentity() |
Автор: KaraKum 13.3.2008, 21:13 | ||
Доброе время суток. После вызова функции glLoadIdentity() ничего не выводится на экран. Для проверки написал:
Треугольник получается такой гигантский, что должен заполнить весь экран - так и есть, но если перед этим кодом поставить вызов функции glLoadIdentity(), то ничего не рисуется. Скажите, в чём проблема? |
Автор: baldina 14.3.2008, 09:04 |
здесь играют роль две матрицы - GL_MODELVIEW_MATRIX и GL_PROJECTION_MATRIX. Ты в какую загружаешь? Какие еще преобразования есть в программе, кроме glLoadIdentity()? Добавлено через 1 минуту и 2 секунды Телепатия мне подсказывает, что во вторую, и твой треугольник оказывается за границами отсечения по глубине. Добавлено через 3 минуты и 36 секунд Кстати, из приведенного кода не следует, что треугольник гигантский и что-то должен заполнить. Весь код желательно увидеть. Если только все матрицы у тебя не Identity - тогда на экране единичный куб. |
Автор: KaraKum 14.3.2008, 10:32 | ||
Твоя интуиция - надёжная штука ![]() Вот код:
Периодически нужно сбрасывать предыдущую матрицу и устанавливать новую, но если использовать функции glLoadIdentity() и glTranslatef() вместе, то уже ничего нельзя вывести на экран. |
Автор: Graf_h 14.3.2008, 10:47 |
Тебе нужно перед преобразованиями записывать состояния матриц а после преобразований их восстановлять и тогда будет тебе счастье ![]() |
Автор: KaraKum 14.3.2008, 11:28 | ||
После
вставил функцию glMatrixMode(GL_PROJECTION); - всё равно ничего не рисуется ![]() И заодно ещё вопросик: почему функция glutTimerFunc(40, ProcessTimerEvent, 1); вызывает функцию ProcessTimerEvent() только один раз, хотя должна делать это 25 раз в секунду? |
Автор: Graf_h 14.3.2008, 11:36 |
glPushMatrix();//Запоминаеш состояние преобразований glLoadIdentity(); //Здесь сбиваеш все преобразования и загружаеш единичную матрицу glTranslatef(...); // твои преобразования но уже отностельно центра... glBegin(GL_TRIANGLES); glColor3f(1, 0, 0); glVertex3f(0, 100, -80); glColor3f(0, 1, 0); glVertex3f(-100, -100, 80); glColor3f(0, 0, 1); glVertex3f(100, -100, 80); glEnd(); glPopMatrix():// восстановляеш состояние преобразований glFlush(); А насчет ProcessTimerEvent(): нужно ее вызывать и в ProcessTimerEvent и также нужно обновлять окно glutPostRedisplay(); |
Автор: KaraKum 14.3.2008, 12:09 | ||
Изменил код и теперь он выглядит так:
Но всё равно ничего не рисуется! ![]() Насчёт таймера: если я правильно понял, в конце функции ProcessTimerEvent() нужно вызвать glutTimerFunc(40, ProcessTimerEvent, 1); И если так, то плохо, что в таком случае программа пожирает всё процессорное время. |
Автор: Graf_h 14.3.2008, 12:27 | ||
Вот тебе пример твоей програмы, все работает! ![]() Ты задавал очень большие координаты, поэтому триугольник у тебя был большой и ты его не видел |
Автор: KaraKum 14.3.2008, 13:15 | ||
Вуаля! В InitGL() добавил функцию glMatrixMode(GL_MODELVIEW); и всё заработало! Большое спасибо ![]() Но с таймером так и не решилось:
|
Автор: Graf_h 14.3.2008, 13:29 |
Я ставил 2 таймера, и ничего не пожерало работало отлично и без тормозов! Здесь просто 25 раз в секунду вызывается твоя функция и все...Можеш сделать свой таймер, например через GetTickCount() |
Автор: KaraKum 14.3.2008, 13:54 |
Да я проверил. Хоть в диспетчере задач и написано, что прога потребляет 100% процессорного времени, но все остальные проги работают нормально, даже проигрыватель. Вобщем всё что хотел узнать - узнал. Спасибо. Вопрос решён. |