I had to make this otherwise the depthTest doesn’t pass : (I’ve added a variable secondDraw to redraw everything at the second draw call)
if (viewUpdated || firstDraw || secondDraw) {
depthBuffer.clear(sf::Color::Transparent);
frontBuffer.clear(sf::Color::Transparent);
currentStates.blendMode = BlendNone;
for (unsigned int i = 0; i < m_newInstances.size(); i++) {
if (m_newInstances[i].getMaterial().getTexture() == nullptr) {
depthBufferGenerator.setParameter("haveTexture", 0);
simpleShader.setParameter("haveTexture", 0);
} else {
depthBufferGenerator.setParameter("haveTexture", 1);
simpleShader.setParameter("haveTexture", 1);
}
currentStates.shader=&depthBufferGenerator;
currentStates.texture=m_newInstances[i].getMaterial().getTexture();
depthBuffer.draw(m_newInstances[i].getAllVertices(),currentStates);
currentStates.shader = nullptr;/*&simpleShader;*/
frontBuffer.draw(m_newInstances[i].getAllVertices(), currentStates);
}
frontBuffer.display();
frontBufferSprite.setCenter(view.getPosition());
//simpleShader.setParameter("haveTexture", 1);
currentStates.blendMode = sf::BlendMode(sf::BlendMode::Factor::OneMinusDstAlpha, sf::BlendMode::Factor::DstAlpha, sf::BlendMode::Add, sf::BlendMode::Factor::OneMinusDstAlpha, sf::BlendMode::Factor::One, sf::BlendMode::Equation::Add);
frameBuffer.draw(frontBufferSprite, currentStates);
if (twoLayers) {
currentStates.shader=&frameBufferGenerator;
currentStates.blendMode=sf::BlendMode(sf::BlendMode::Factor::OneMinusDstAlpha, sf::BlendMode::Factor::DstAlpha, sf::BlendMode::Equation::Add, sf::BlendMode::Factor::OneMinusDstAlpha, sf::BlendMode::Factor::One, sf::BlendMode::Equation::Add);
for (unsigned int i = 0; i < m_newInstances.size(); i++) {
if (m_newInstances[i].getMaterial().getTexture() == nullptr)
frameBufferGenerator.setParameter("haveTexture", 0);
else
frameBufferGenerator.setParameter("haveTexture", 1);
currentStates.texture = m_newInstances[i].getMaterial().getTexture();
frameBuffer.draw(m_newInstances[i].getAllVertices(), currentStates);
}
} else {
/*depthBuffer.bind();
glCheck(glBindBuffer(GL_PIXEL_PACK_BUFFER, pboIds[0]));
glCheck(glReadBuffer(GL_COLOR_ATTACHMENT0_EXT));
glCheck(glReadPixels(0, view.getSize().y - (view.getPosition().y + view.getSize().y), view.getSize().x, view.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, 0));
glCheck(glBindBuffer(GL_PIXEL_PACK_BUFFER, pboIds[1]));
GLubyte* src = (GLubyte*) glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
unsigned int nbLayers = 0;
unsigned int layerValue = 0;
if(src) {
for (unsigned int i = 0; i < view.getSize().x * view.getSize().y; i++) {
if ((unsigned int) (src[i*4+2]) > layerValue) {
nbLayers++;
layerValue = (unsigned int) (src[i*4+2]);
}
}
}
glCheck(glUnmapBuffer(GL_PIXEL_PACK_BUFFER));
glCheck(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));*/
/*unsigned int nbLayers = 0;
unsigned int size = view.getSize().x * view.getSize().y * 4;
const sf::Uint8 * data = new unsigned char[size];
depthBuffer.display();
sf::Image img = depthBuffer.getTexture().copyToImage();
data = img.getPixelsPtr();
for (unsigned int i = 0; i < size / 4; i++) {
if ((float)(data[i*4+2]) > nbLayers) {
nbLayers++;
}
//std:cout<<"depthBufferdata "<<" i : "<<((float)(data[i*4]))<<","<<((float)(data[i*4+1]))<<","<<((float)(data[i*4+2]))<<","<<((float)(data[i*3]))<<std::endl;
}*/
unsigned int nbLayers = newBatcher.getNbLayers()-1;
std::cout<<"nb layers : "<<nbLayers<<std::endl;
for (unsigned int i = 0; i < nbLayers; i++) {
currentStates.shader = &frameBufferGenerator;
currentStates.blendMode = sf::BlendNone;
frontBuffer.clear(sf::Color::Transparent);
for (unsigned int i = 0; i < m_newInstances.size(); i++) {
if (m_newInstances[i].getMaterial().getTexture() == nullptr) {
frameBufferGenerator.setParameter("haveTexture", 0);
} else {
frameBufferGenerator.setParameter("haveTexture", 1);
}
currentStates.texture=m_newInstances[i].getMaterial().getTexture();
frontBuffer.draw(m_newInstances[i].getAllVertices(), currentStates);
}
frontBuffer.display();
frontBufferSprite.setCenter(view.getPosition());
currentStates.shader = &depthPeelingGenerator;
currentStates.texture = &depthBuffer.getTexture();
depthBuffer.setActive();
glCheck(glClear(GL_DEPTH_BUFFER_BIT));
for (unsigned int i = 0; i < m_newInstances.size(); i++) {
depthBuffer.draw(m_newInstances[i].getAllVertices(), currentStates);
}
depthBuffer.display();
//Problem, depthTexture is emplty!!!
currentStates.shader = nullptr;/*&simpleShader;
simpleShader.setParameter("haveTexture", 1);*/
currentStates.blendMode = sf::BlendMode(sf::BlendMode::Factor::OneMinusDstAlpha, sf::BlendMode::Factor::DstAlpha, sf::BlendMode::Add, sf::BlendMode::Factor::OneMinusDstAlpha, sf::BlendMode::Factor::One, sf::BlendMode::Equation::Add);
frameBuffer.draw(frontBufferSprite, currentStates);
}
}
/*for (unsigned int j = 0; j < m_newInstances.size(); j++) {
m_instances.push_back(m_newInstances[j]);
}
m_newInstances.clear();
newBatcher.clear();*/
for (unsigned int i = 0; i < drawables.size(); i++) {
frameBuffer.draw(drawables[i].first.get(), drawables[i].second);
}
frameBuffer.display();
previousFrame.clear(backgroundColor);
currentStates.blendMode = sf::BlendNone;
currentStates.shader = nullptr;
frameBufferSprite.setCenter(view.getPosition());
previousFrame.draw(frameBufferSprite, currentStates);
previousFrame.display();
previousFrameBufferSprite.setCenter(view.getPosition()); //std::cout<<"view updated!"<<std::endl;
if (!firstDraw)
secondDraw = false;
firstDraw = false;
viewUpdated = false;
} else {
//std::cout<<"draw previous frame!"<<std::endl;
currentStates.blendMode = sf::BlendNone;
currentStates.shader = nullptr;
frameBuffer.draw(previousFrameBufferSprite, currentStates);
frameBuffer.display();
const Texture& text = frameBuffer.getTexture();
Image img = text.copyToImage();
bool found = false;
for (unsigned int x = 0; x < img.getSize().x && !found; x++) {
for (unsigned int y = 0; y < img.getSize().y && !found; y++) {
if ((int) img.getPixel(x, y).r > 0) {
std::cout<<(int) img.getPixel(x, y).r<<std::endl;
found = true;
}
}
}
}