воскресенье, 22 января 2012 г.

Рендер в текстуру на основе opengl fbo

Разнообразие вендоров железа "обогатило" в прекрасном смысле этого слова рендеринг в текстуру. Какая только экзотика не была ( p-buffer ). На данный момент есть вменяемый вариант RTT через расширение EXT_framebuffer_object.  Вся идея данного расширения сводится к добавлению нового объекта FBO ( frame buffer object ). К этому объекту можно сделать привязку различных объектов, будь то буфер цвета, глубины, трафарет или RBO (renderbuffer object).

Приступим к написанию кода

Для начала проверяем поддержку данного расширения 

  1. - (BOOL) initFBO  
  2. {  
  3.     // check extension  
  4.     const GLubyte* extensions = glGetString ( GL_EXTENSIONS );  
  5.     if ( extensions )  
  6.     {     
  7.       if(gluCheckExtension((GLubyte*)("GL_EXT_framebuffer_object"), extensions))  
  8.         return YES;  
  9.     }  
  10.     return NO;  
  11. }  

Создаем текстуру в которую будем рендерить

  1. GLuint textureId      
  2. glGenTextures ( 1, &textureId );  
  3. glBindTexture ( GL_TEXTURE_2D, textureId );  
  4. glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );  
  5. glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );  
  6. glTexImage2D ( GL_TEXTURE_2D, 0, 4, TextureWidth, TextureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0 );  

Создаем FBO объект

  1. GLuint frameBufferId;  
  2.   
  3. glGenFramebuffersEXT ( 1, &frameBufferId ); // 0 - это главный буфер, очевидно что id > 0  
  4. glBindFramebufferEXT ( GL_FRAMEBUFFER_EXT, frameBufferId );  
  5. glFramebufferTexture2DEXT ( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,  
  6.  GL_TEXTURE_2D, textureId, 0 ); //привязываем тексту к фрэймбуфер  
  7.   
  8. // проверяем буфер ( код ниже )  
  9. // ...  
  10.   
  11. glBindFramebufferEXT ( GL_FRAMEBUFFER_EXT, 0 ); // восстанавливаем главный буфер  

Проверка буфера

  1. GLenum status = glCheckFramebufferStatusEXT ( GL_FRAMEBUFFER_EXT );  
  2. if ( status != GL_FRAMEBUFFER_COMPLETE_EXT )  
  3. {  
  4.     switch ( status )  
  5.     {  
  6.         case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:  
  7.             NSLog(@"FBO GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT");  
  8.             break;  
  9.         case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:  
  10.             NSLog(@"FBO GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT");  
  11.             break;  
  12.         case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:  
  13.             NSLog(@"FBO GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT");  
  14.             break;  
  15.         case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:  
  16.             NSLog(@"FBO GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT");  
  17.             break;  
  18.         case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:  
  19.             NSLog(@"FBO GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT");                            
  20.             break;  
  21.         case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:  
  22.             NSLog(@"FBO GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT");  
  23.             break;  
  24.         case GL_FRAMEBUFFER_UNSUPPORTED_EXT:  
  25.             NSLog(@"FBO GL_FRAMEBUFFER_UNSUPPORTED_EXT");  
  26.             break;  
  27.         default:  
  28.             NSLog(@"FBO Unknown error");  
  29.               
  30.             break;  
  31.     }  
  32.         
  33.     return NO;  
  34. }  

Разумеется можно еще добавить создание буфера глубины или трафарета, сделать привязку к данному FBO. Если все успешно создалось то можно рендерить в текстуру.

  1. glBindFramebufferEXT ( GL_FRAMEBUFFER_EXT, frameBufferId ); // выставляем нужный нам буфер  
  2.   
  3. glClearColor ( 0.0f, 0.0f, 1.0f, 1.0f );   
  4. glClear ( GL_COLOR_BUFFER_BIT );  
  5.   
  6. // что-то рисуем в текстуру ( корректируем все матрицы )
  7. // ...  
  8.   
  9. glBindFramebufferEXT ( GL_FRAMEBUFFER_EXT, 0 );      // восстанавливаем буфера окна  

Теперь у нас в текстуре которая была привязана к данному framebuffer объекту находится то что нам нужно. Можем с ней работать как с обычной текстурой. Отрисовать всю сцену в текстуру и применить эфффект блюра.  И конечно не забывайте удалять текстуры и буфера ;-)

Example OpenGL FBO (github) готовый пример показывает наглядно как с этим работать


воскресенье, 8 января 2012 г.

Забавный баг XCode 4.2

На данный момент xcode до той же visal studio далеко. Не факт, что это изменится в ближайшем будущем. Виной тому, весьма плохое отношение разработчиков к более плотному тестирование IDE. В четверке сделали приятное разработчикам разрешили иметь некий аналог солюшенов. Но есть одна фича которой приятно пользоваться, потому как она автоматизирует процесс привязки gui контролов с кодом (actions & properties).

Взглянем на солюшен с двуми проектами один из которых вложенный.
Добавим для формы из второго проекта кнопку. Проведем связь из IB в код для создания @property-кнопки ( не так важно свойство или метод ).


Теперь посмотрим чего же там в итоге то получается. О! В хедер корректно добавлось свойство-кнопка. Но где же описание ? Увы оно в другой проект прописалось.


Возможно этот баг уже поправили. Критичным его назвать сложно. Но в целом можно судить что работа с солюшенами по аналогии с той же студией от микрософт, пока реализована не так хорошо.
Новую морду нацепили, а в результата одни мелкие недоработки.

воскресенье, 1 января 2012 г.

Железяка Amazon Kindle Touch

Прогресс не стоит на месте. Цены падают, устройства становятся более доступныеми для простых смертных. Первая книга с тачем от амазона. Психологический барьер в 100 баксов преодолен ( мне по такой цене удалось заполучить перед НГ девайс, увы c рекламой правда ). Несоменно сравнивать с другими аналогими смысла нету. C тем же Nook, где после некоторых усилий читалку можно превратить в псевдо планшет на электронной бумаге с полноценным андройдом на борту. Но это все лирика. Вернемся к киндлу четвертого поколения.

В общих чертах плюсы

+ сенсорный экран ( это удобно после ipad, iphone и прочих устройств подобной тематики )
+ перелистывание теперь более шустрое ( если сравнивать с третьим поколением )
+ заметки
+ качественная сборка ( ничего не хрустит, не скользит приятный на ощупь пластик )
+ цена ( вы получаете то что вам нужно без всяких не нужных наворотов )

 В числе минусов хотелось бы отметить

- пока сырая прошивка ( мало настроек, поворачивать экран нельзя )
- прощаю что нету поддержки fb2, но где поддержка epub ????
- официально киндл в нашей стране не продается, поэтому ощутить все прелести от платного  контента не получится

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


Update (30.06.2012) 
Обновил прошивку на девайсе до 5.1.0.
Тяжелые книжки стали открываться без подглючивания устройства. Интерфейс стал более отзывчив. Был глюк на 5.0.0 если много закинуть книгу на устройство с устройством происходило странное, переодическое подвисание. После обновление залил более 50 книг большого размера, устройство открывает книги без проблем. Из дополнительных плюсов добавился Landscape Mode, дополнительные настройки форматирование вывода текста (больше текста на экране), поддержка защищенных WI-FI сетей. Добавили кучу локализаций, но увы русского языка нету, видимо его вообще не будет. Кому надо скачают поделки народных умельцев.

Kindle Touch Software Update Version 5.1.0

В итоге имеем более стабильную работу устройства.  Перед прошивкой весь контент лучше удалить.