Я пытался сделать сцену с OpenGL в Objective-C целыми неделями, и я просто не могу заставить ее работать. Я начал с Drawing to an NSOpenGLView Class: A Tutorial, и это сработало хорошо для меня, и я даже смог немного расширить его, но руководство по программированию OpenGL оставляет после этого шага какое-то отверстие. Они объясняют детали того, как удваивать буфер и синхронизировать частоту обновления, и все это, но они не содержат никаких реальных примеров того, как обновлять представление. Поэтому в настоящее время я могу нарисовать на экране много классных вещей, но как только он там, это просто статическое изображение. Нет движения, нет вращения.
Кто-нибудь знает о хорошем, простой пример того, как это делается?Простой пример OpenGL с Cocoa
ответ
Это проблема, я часто сталкиваюсь, и это меня удивляет, что этот важный шаг не является частью NSOpenGLView учебную документацию.
Вы должны установить таймер обратного вызова для уведомления мнения о том, что нужно перерисовывать:
- (void)awakeFromNib
{
NSTimer *updateTimer = [NSTimer timerWithTimeInterval:1.0f/30.0f target:self selector:@selector(idle:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:updateTimer forMode:NSDefaultRunLoopMode];
}
Обратите внимание, что это происходит в awakeFromNib
. Таймер срабатывает с интервалом 1/30, который вы можете изменить, если хотите. Каждый раз, когда он срабатывает, он вызывает функцию с именем idle
. Эта функция может быть реализована следующим образом:
- (void)idle:(NSTimer*)timer
{
[self setNeedsDisplay:YES];
}
Это приводит мнение перекроить себя все обновления, включая вашу OpenGL графику.
Это очень общий вопрос и как, наконец, создать всю структуру механизма рендеринга, зависит от вас. Было бы очень много, чтобы рассказать вам, как реализовать это, но есть множество книг и учебников онлайн, чтобы получить startet.
Очень приятно серьезно относиться к тому, как медленно создать простую структуру, подходящую для игр (в данном случае 2D), можно найти here, но это для Win32, поэтому вам нужно будет адаптировать это, но при условии, что у вас есть общее понимание программирования, вы должны понимать общий дизайн, который он создает.
Вы можете попробовать использовать ссылку на изображение для повторного рисования, синхронизированного с дисплеем. Установите один вверх:
GLint swapInt = 1;
[yourContext setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];
CVDisplayLinkCreateWithActiveCGDisplays(&displayLink);
CVDisplayLinkSetOutputCallback(displayLink, &displayLinkCallback, self);
CGLContextObj cglContext = [yourContext CGLContextObj];
CGLPixelFormatObj cglPixelFormat = [[NSOpenGLView defaultPixelFormat] CGLPixelFormatObj];
CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(displayLink, cglContext, cglPixelFormat);
CVDisplayLinkStart(displayLink);
Затем, ваш обратный вызов выполняется один раз за кадр:
static CVReturn displayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* displayLinkContext)
{
NSAutoreleasePool* pool = [NSAutoreleasePool new];
if ([self lockFocusIfCanDraw])
{
//Your drawing code
[self unlockFocus];
}
[pool drain];
return kCVReturnSuccess;
}
Что это за объект IRGL, который вы используете? Документация Apple, похоже, не знает, что это такое. – anthropomorphic
Это объект, который вы используете, который содержит ваш контекст? Я получил, что '[IRGL gl]' возвращает NSOpenGLContext (или его подкласс), должен ли я просто игнорировать эту часть? – anthropomorphic
Упс! Это мой собственный класс, который я случайно оставил. Просто получите свой контекст, как бы вы ни хотели. Если вы уже рисуете, у вас должен быть один. – andyvn22
- 1. Cocoa OpenGL всегда белый
- 2. Cocoa OpenGL Texture Creation
- 3. OpenGL и Cocoa не работают
- 4. Проблемы с обменом текстурами с OpenGL/Cocoa
- 5. Простой пример с Symfony2
- 6. Cocoa - простой анализатор collada
- 7. простой freeimage с примером opengl
- 8. Ищете простой пример OpenGL (3.2+) Python, который использует GLFW
- 9. Каркас Cocoa, интегрированный с GLUT и OpenGL
- 10. Работа с OpenGL через Objective-C/Cocoa
- 11. OpenGL 2d пример игры
- 12. Простой пример Feross - пример кода?
- 13. C++ OpenGL - пример Overlay
- 14. RSA Простой пример с Javascript?
- 15. Простой пример Masstransit с RabbitMQ
- 16. Простой пример NSURLSession с аутентификацией
- 17. Простой пример Json с android
- 18. простой пример многопоточности с tornado.web.RequestHandler
- 19. Простой пример AJAX с Grails
- 20. Как настроить простой вид таблицы в Cocoa
- 21. Лучший способ рисовать текст с OpenGL и Cocoa?
- 22. Простой пример ASP.NET MVC
- 23. Простой пример SSL GoLang
- 24. StackExchange.Redis простой C# Пример
- 25. Простой пример BeautifulSoup Python
- 26. простой пример обрезки jquery
- 27. Простой пример Android RecyclerView
- 28. Простой пример AJAX - Silverstripe
- 29. NSXMLParser Простой пример
- 30. v4l2 очень простой пример
Обратите внимание, что это не очень хороший вариант для высокопроизводительного рисования; вы должны действительно использовать ссылку для отображения, чтобы убедиться, что вы рисуете в соответствующие моменты времени для своего дисплея. – andyvn22