2013-02-24 3 views
1

Я использую классы Qt5 и QGLWidget для визуализации живого потока пикселей. У меня возникают некоторые проблемы с производительностью и вы хотите настроить буфер пикселей для выполнения асинхронной передачи данных.Что такое магия внутри bindTexture Qt?

Я пытаюсь связать текстуру старомодным способом, но визуализируется как пустой. Когда я возвращаюсь к своему Qt5-коду, все работает.

Кто-нибудь знает, как заставить стандартную версию OpenGL работать?

Работая

void glStream::reserveTextures() 
{ 
    displayBuff = (GLubyte*) calloc(numGLFrames*widthGL*heightGL, 
    sizeof(GLubyte)); 

    QImage mySurface(&displayBuff[displayStart],widthGL,heightGL, 
    QImage::Format_Indexed8); 
    textures[0]=bindTexture(mySurface,GL_TEXTURE_2D,GL_LUMINANCE); 

    glBindTexture(GL_TEXTURE_2D,0); 
    glECheck();//no errors 
} 

не работает

void glStream::reserveTextures() 
{ 
    displayBuff = (GLubyte*) calloc(numGLFrames*widthGL*heightGL,sizeof(GLubyte)); 

    glGenTextures(1,&textures[0]); 
    glBindTexture(GL_TEXTURE_2D,textures[0]); 
    glTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE,widthGL,heightGL,0,GL_LUMINANCE, 
    GL_UNSIGNED_BYTE,&displayBuff[displayStart]); 

    glBindTexture(GL_TEXTURE_2D,0); 
    glECheck();//no errors 
} 

Update Функция

glECheck(); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
program1.bind(); 
program1.setUniformValue("texture", 0); 
program1.enableAttributeArray(vertexAttr1); 
program1.enableAttributeArray(vertexTexr1); 
program1.setAttributeArray(vertexAttr1, vertices.constData()); 
program1.setAttributeArray(vertexTexr1, texCoords.constData()); 
glBindTexture(GL_TEXTURE_2D, textures[0]); 
glECheck(); 
glDrawArrays(GL_TRIANGLES, 0, vertices.size()); 
glBindTexture(GL_TEXTURE_2D,0); 
program1.disableAttributeArray(vertexTexr1); 
program1.disableAttributeArray(vertexAttr1); 
program1.release(); 
glECheck(); 

Shader

QGLShader *fshader1 = new QGLShader(QGLShader::Fragment, this); 
    const char *fsrc1 = 
     "uniform sampler2D texture;\n" 
     "varying mediump vec4 texc;\n" 
     "void main(void)\n" 
     "{\n" 
     " gl_FragColor = texture2D(texture, texc.st);\n" 
     "}\n"; 

    fshader1->compileSourceCode(fsrc1); 
    program1.addShader(fshader1); 

ответ

3

Казалось бы, что вам нужно несколько других параметров позволили, чтобы отобразить текстуру.

void glStream::reserveTextures() 
{ 
    displayBuff = (GLubyte*) calloc(numGLFrames*widthGL*heightGL,sizeof(GLubyte)); 

    glGenTextures(1,&textures[0]); 
    glBindTexture(GL_TEXTURE_2D,textures[0]); 
    glTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE,widthGL,heightGL,0,GL_LUMINANCE, 
    GL_UNSIGNED_BYTE,&displayBuff[displayStart]); 

    //This is the magic inside Qt5's implementation 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

    glBindTexture(GL_TEXTURE_2D,0); 
    glECheck();//no errors 
} 
Смежные вопросы