Я пытаюсь сделать в объекте FBO с QT 5.2, на ПК все работает отлично, но Mobile-Screen остается черным. КСТАТИ. Это телефон Android.
Здесь код для инициализации:
GLANN::GLANN(unsigned int width, unsigned int height, unsigned int renderPasses, Scene *renderScene,
QWidget *parent, QGLWidget *shareWidget)
: QGLWidget(parent, shareWidget)
{
makeCurrent();
setFixedWidth(width);
setFixedHeight(height);
this->width = width;
this->height = height;
qsrand((uint)QTime::currentTime().msec());
mScene = renderScene;
SceneImage = renderScene->getSceneImage();
numObjects = SceneImage->width();
renderedImage = new Playground(texSize,texSize);
}
void GLANN::initializeGL(){
setAutoBufferSwap(true);
initializeGLFunctions();
glEnable(GL_CULL_FACE);
glClearColor(0.0, 0.0, 0.0, 0.0);
initShader();
initTextures();
// Generate 2 VBOs
glGenBuffers(1, &vboId0);
glGenBuffers(1, &vboId1);
VertexData vertices[] = {
// Vertex data for face 0
{QVector3D(-1.0, -1.0, 1.0), QVector2D(0.0, 0.0)}, // v0
{QVector3D( 1.0, -1.0, 1.0), QVector2D(1.0, 0.0)}, // v1
{QVector3D(-1.0, 1.0, 1.0), QVector2D(0.0, 1.0)}, // v2
{QVector3D( 1.0, 1.0, 1.0), QVector2D(1.0, 1.0)}, // v3
};
// Transfer vertex data to VBO 0
glBindBuffer(GL_ARRAY_BUFFER, vboId0);
glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(VertexData), vertices, GL_STATIC_DRAW);
GLushort indices[] = {
0, 1, 2, 3, 3,
};
// Transfer index data to VBO 1
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId1);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 5 * sizeof(GLushort), indices, GL_STATIC_DRAW);
//Init the Framebuffer
initFbo();
// Use QBasicTimer because its faster than QTimer
timer.start(0, this);
}
bool GLANN::initFbo(){
fbo = new QOpenGLFramebufferObject(texSize, texSize);
return true;
}
И здесь для рендеринга:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// Set random seed
program.setUniformValue("seedX", ((float)qrand()/RAND_MAX));
program.setUniformValue("seedY", ((float)qrand()/RAND_MAX));
//Set number of alredy rendered passes
program.setUniformValue("numRenderPass",mRenderPasses);
//Set program to fbo render mode
program.setUniformValue("fbo",true);
//Bind last rendered Image
//pixelsRenderedImage = bindTexture(*renderedImage);
//Load Identity
//glLoadIdentity();
//Move to rendering point
//glTranslatef( -1.0, -1.0, 0.0f );
// Draw geometry
// Tell OpenGL which VBOs to use
// Render to our framebuffer
fbo->bind();
glViewport(0,0,texSize,texSize);
// Tell OpenGL which VBOs to use
glBindBuffer(GL_ARRAY_BUFFER, vboId0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId1);
// Offset for position
int offset = 0;
// Tell OpenGL programmable pipeline how to locate vertex position data
int vertexLocation = program.attributeLocation("a_position");
program.enableAttributeArray(vertexLocation);
glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset);
// Offset for texture coordinate
offset += sizeof(QVector3D);
// Tell OpenGL programmable pipeline how to locate vertex texture coordinate data
int texcoordLocation = program.attributeLocation("a_texcoord");
program.enableAttributeArray(texcoordLocation);
glVertexAttribPointer(texcoordLocation, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset);
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, pixelsRenderedImage);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, pixelsScene);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, pixelsRandom);
// Draw cube geometry using indices from VBO 1
glDrawElements(GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_SHORT, 0);
fbo->release();
pixelsRenderedImage = fbo->takeTexture();
//Set Program to screen frendering
program.setUniformValue("fbo",false);
//Set Viewport back to default
glViewport(0,0,width,height);
//Render To Screen
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, pixelsRenderedImage);
// Draw quad geometry using indices from VBO 1
glDrawElements(GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_SHORT, 0);
Надеюсь, я понимаю, что я пытаюсь сделать здесь...
EDIT: Снято glEnable (TEXTURE_2D). Все еще получаю черный экран, но нет ошибок из glError();
GLANN::GLANN(unsigned int width, unsigned int height, unsigned int renderPasses, Scene *renderScene,
QWidget *parent, QGLWidget *shareWidget)
: QGLWidget(parent, shareWidget)
{
setFixedWidth(width);
setFixedHeight(height);
this->width = width;
this->height = height;
qsrand((uint)QTime::currentTime().msec());
mScene = renderScene;
SceneImage = renderScene->getSceneImage();
numObjects = SceneImage->width();
renderedImage = new Playground(texSize,texSize);
}
void GLANN::initializeGL(){
//setAutoBufferSwap(true);
makeCurrent();
initializeGLFunctions();
qDebug() << glGetError() << "Line 28";
//glEnable(GL_CULL_FACE);
glClearColor(0.0, 0.0, 0.0, 0.0);
initShader();
qDebug() << glGetError() << "Line 36";
initTextures();
qDebug() << glGetError() << "Line 40";
// Generate 2 VBOs
glGenBuffers(1, &vboId0);
glGenBuffers(1, &vboId1);
VertexData vertices[] = {
// Vertex data for face 0
{QVector3D(-1.0, -1.0, 1.0), QVector2D(0.0, 0.0)}, // v0
{QVector3D( 1.0, -1.0, 1.0), QVector2D(1.0, 0.0)}, // v1
{QVector3D(-1.0, 1.0, 1.0), QVector2D(0.0, 1.0)}, // v2
{QVector3D( 1.0, 1.0, 1.0), QVector2D(1.0, 1.0)}, // v3
};
// Transfer vertex data to VBO 0
glBindBuffer(GL_ARRAY_BUFFER, vboId0);
glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(VertexData), vertices, GL_STATIC_DRAW);
GLushort indices[] = {
0, 1, 2, 3, 3,
};
// Transfer index data to VBO 1
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId1);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 5 * sizeof(GLushort), indices, GL_STATIC_DRAW);
qDebug() << glGetError() << "Line 57";
//Init the Framebuffer
initFbo();
qDebug() << glGetError() << "Line 62";
// Use QBasicTimer because its faster than QTimer
timer.start(0, this);
}
bool GLANN::initFbo(){
fbo = new QOpenGLFramebufferObject(texSize, texSize);
return true;
}
void GLANN::resizeGL(int w, int h){
glViewport(0,0,w,h);
}
void GLANN::mouseMoveEvent(QMouseEvent* event){
if(event->buttons() == Qt::LeftButton){
LineObject newPoly(xTemp,yTemp, 1.0f*event->pos().x()/width, 1.0f-1.0f*event->pos().y()/width,qRgba(255,255,255,255),0.4,0.5,0.3,0.0);
mScene->addObject(newPoly);
SceneImage = mScene->getSceneImage();
numObjects = SceneImage->width();
//Bind WeightmapTexture
pixelsScene = QGLWidget::bindTexture(*SceneImage);
qDebug() << xTemp << yTemp << numObjects;
//Bind last rendered Image
renderedImage->fill(qRgba(0,0,0,255));
pixelsRenderedImage = bindTexture(*renderedImage);
mRenderPasses = 0;
// Set number of Objects
program.setUniformValue("numObjects",numObjects);
xTemp = 1.0f*event->pos().x()/width;
yTemp = 1.0f-1.0f*event->pos().y()/height;
}
}
void GLANN::mousePressEvent(QMouseEvent* event){
if(event->button() == Qt::LeftButton){
xTemp = 1.0f*event->pos().x()/width;
yTemp = 1.0f-1.0f*event->pos().y()/height;
}
}
void GLANN::paintGL(){
render();
//getFeedbackTexture();
//increment number of rendered passes
mRenderPasses++;
}
void GLANN::render(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// Set random seed
program.setUniformValue("seedX", ((float)qrand()/RAND_MAX));
program.setUniformValue("seedY", ((float)qrand()/RAND_MAX));
//Set number of alredy rendered passes
program.setUniformValue("numRenderPass",mRenderPasses);
//Set program to fbo render mode
program.setUniformValue("fbo",true);
//Bind last rendered Image
//pixelsRenderedImage = bindTexture(*renderedImage);
//Load Identity
//glLoadIdentity();
//Move to rendering point
//glTranslatef( -1.0, -1.0, 0.0f );
// Draw geometry
// Tell OpenGL which VBOs to use
// Render to our framebuffer
fbo->bind();
glViewport(0,0,texSize,texSize);
// Tell OpenGL which VBOs to use
glBindBuffer(GL_ARRAY_BUFFER, vboId0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId1);
// Offset for position
int offset = 0;
// Tell OpenGL programmable pipeline how to locate vertex position data
int vertexLocation = program.attributeLocation("a_position");
program.enableAttributeArray(vertexLocation);
glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset);
// Offset for texture coordinate
offset += sizeof(QVector3D);
// Tell OpenGL programmable pipeline how to locate vertex texture coordinate data
int texcoordLocation = program.attributeLocation("a_texcoord");
program.enableAttributeArray(texcoordLocation);
glVertexAttribPointer(texcoordLocation, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset);
qDebug() << glGetError() << "Line 167";
//glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, pixelsRenderedImage);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, pixelsScene);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, pixelsRandom);
// Draw cube geometry using indices from VBO 1
glDrawElements(GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_SHORT, 0);
qDebug() << glGetError() << "Line 183";
fbo->release();
pixelsRenderedImage = fbo->texture();
//Set Program to screen frendering
program.setUniformValue("fbo",false);
//Set Viewport back to default
glViewport(0,0,width,height);
//Render To Screen
//glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, pixelsRenderedImage);
// Draw quad geometry using indices from VBO 1
glDrawElements(GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_SHORT, 0);
qDebug() << glGetError();
}
Проблема, вероятно, вызвана следующим:
И это: