Мягкие тени, любуйтесь.
Вместе с этим я еще сделал управляемый процесс пост обработки. Вешается свой колбэк. Вот пример:
class MyRenderCallback : public mfRenderCallback
{
public:
MyRenderCallback(mfScene *scene)
{
m_hdr = scene->loadProgram("hdr.glsl");
m_ssao[0] = scene->loadProgram("ssao_pass_1.glsl");
m_ssao[1] = scene->loadProgram("ssao_pass_2.glsl");
m_screenBuffer = scene->createRenderFramebuffer(0, 0);
m_ssaoBuffer[0] = scene->createRenderFramebuffer(0, 0);
m_ssaoBuffer[1] = scene->createRenderFramebuffer(0, 0);
}
void onRender(mfRenderContext *context)
{
context->drawScreenToFramebuffer(m_screenBuffer);
context->setFramebufferToProgram("_screen_buffer_", m_screenBuffer, m_ssao[0], 0);
context->processEffectToFramebuffer(m_ssao[0], m_ssaoBuffer[0]);
context->setFramebufferToProgram("_base_screen_buffer_", m_screenBuffer, m_ssao[1], 0);
context->setFramebufferToProgram("_screen_buffer_", m_ssaoBuffer[0], m_ssao[1], 1);
context->processEffectToFramebuffer(m_ssao[1], m_ssaoBuffer[1]);
context->setFramebufferToProgram("_screen_buffer_", m_ssaoBuffer[1], m_hdr, 0);
context->processEffectToScreen(m_hdr);
}
private:
mfProgram *m_hdr = 0;
mfProgram *m_ssao[2];
mfFramebuffer *m_screenBuffer = 0;
mfFramebuffer *m_ssaoBuffer[2];
};