2016-08-26 5 views
-1

Я использую QtOpenGL ES 3.0 с видеоустройством v4l2. С помощью этой функции ...Как рисовать на существующую привязку цвета opengl?

GLuint QOpenGLFramebufferObject :: takeTexture (интермедиат colorAttachmentIndex)

я могу захватить GLuint и в моем сознании, я должен быть в состоянии привлечь к нему. У меня есть буфер V4L2, который находится в буфере void *. Мне нужно разместить этот буфер в привязке цвета в моем цикле рендеринга. Я видел много ссылок на обычные переходы API, используя glTexImage2D(). Поэтому у меня есть это ...

//.h 

QOpenGLFramebufferObject * m_fbo; 
GLuint      m_fboColorAttachment; 

//.cpp 
//...init code... 

m_fbo = new QOpenGLFramebufferObject (D1_WIDTH, D1_HEIGHT); 
glBindFramebuffer (GL_FRAMEBUFFER, m_fbo->handle()); // read and write 
m_fbo->addColorAttachment (D1_WIDTH, D1_HEIGHT); 

//...end init code... 
//...render loop... 

glBindFramebuffer (GL_FRAMEBUFFER, m_fbo->handle()); // read and write 
m_fboColorAttachment = m_fbo->takeTexture();  
glBindTexture (GL_TEXTURE_2D, m_fboColorAttachment); 

glTexImage2D (GL_TEXTURE_2D,    // Type of texture 
       0,       // Pyramid level (for mip-mapping) - 0 is 
              //the top level 
       GL_RGBA,      // Internal colour format to convert to 
       m_nWidth,     // Image width 
       m_nHeight,     // Image height 
       0,       // Border width in pixels (can either be 1 
              //or 0) 
       GL_RGB, //GL_RGB565,  // Input image format (i.e. GL_RGB, GL_RGBA, 
              //GL_BGR etc.) 
       GL_UNSIGNED_SHORT_5_6_5,  // Image data type 
       (char*) m_v4l2Device->pool->buffers[ nIndex ].mem); // The actual image 
                    //data itself 

//check if OpenGL errors happened 

if ((enumError = glGetError()) != GL_NO_ERROR) 
{ 
    qDebug ("OpenGL error: %d.", enumError); 
} 

Я получаю сообщение об ошибке. Итак, вот мой вопрос, как я должен писать на это GLuintfromchar*data? Моя цель состояла в том, чтобы не создавать новый буфер и прикрепить его как новое вложение цветов в каждом цикле рендеринга. Если уже есть прикрепление цвета texture2dcreated, кажется, я смогу снова и снова заполнить его новыми данными.

Я видел, как люди создают новые буферы и прикладывают их, а затем буфер визуализации и бла. Но я не понимаю, почему это необходимо, если цвет texture2dalreadyexists. Я хочу повторно использовать его с моим v4l2charbufferdata.

Приветствие, Пит

ответ

0

OpenGL ES не поддерживает преобразование формата как часть загрузки текстур. В вызове glTexImage2D()внутренний формат и формат/тип должен быть совместимым, основываясь на таблицах 3.2. и 3.3 в спецификации ES 3.0.

На основании значений в таблице 3.3, для некалиброванной GL_RGBAinternalformat, единственного юридического формата является GL_RGBA, в сочетании с типом, который является одним из GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT_4_4_4_4 или GL_UNSIGNED_SHORT_5_5_5_1.

Для GL_RGB/GL_UNSIGNED_SHORT_5_6_5формат/типа комбо вы пытаетесь использовать, то internalformat значение должно быть GL_RGB или GL_RGB565. Я всегда рекомендую использовать значения internalformat. Неограниченные значения поддерживаются только для совместимости со старыми версиями OpenGL.

+0

yup, все. я изменил формат входного изображения на rgba, чтобы он соответствовал желаемому формату изображения перед использованием opengl. a = 1 быть прозрачным. это работает намного лучше. – PeterVE

Смежные вопросы