Skip to content

Commit

Permalink
Gloom: Rendering shadows; cleaned up shaders
Browse files Browse the repository at this point in the history
  • Loading branch information
skyjake committed Sep 1, 2019
1 parent 73b0587 commit a8614c7
Show file tree
Hide file tree
Showing 26 changed files with 299 additions and 154 deletions.
3 changes: 3 additions & 0 deletions doomsday/tests/test_gloom/gloom/gloomworld.cpp
Expand Up @@ -81,6 +81,7 @@ DENG2_PIMPL(GloomWorld), public Asset
renderContext.uAtlas = renderContext.atlas;
renderContext.ssao = &ssao;
renderContext.gbuffer = &gbuffer;
renderContext.lights = &mapRender.lights();
renderContext.map = ↦

environ.setWorld(thisPublic);
Expand Down Expand Up @@ -221,6 +222,8 @@ void GloomWorld::update(TimeSpan const &elapsed)

void GloomWorld::render(ICamera const &camera)
{
if (!d->isReady()) return;

d->gbuffer.resize(GLState::current().target().size());
d->gbuffer.clear();

Expand Down
2 changes: 1 addition & 1 deletion doomsday/tests/test_gloom/gloom/render/context.cpp
Expand Up @@ -22,7 +22,7 @@ using namespace de;

namespace gloom {

void Context::bind(GLProgram &program) const
void Context::bindTo(GLProgram &program) const
{
program << uAtlas << uCurrentTime << view.uMvpMatrix << view.uWorldToViewMatrix;
}
Expand Down
5 changes: 4 additions & 1 deletion doomsday/tests/test_gloom/gloom/render/context.h
Expand Up @@ -31,6 +31,7 @@ namespace gloom {

class GBuffer;
class SSAO;
class LightRender;

struct Context {
const de::ImageBank *images;
Expand All @@ -40,11 +41,13 @@ struct Context {
View view;
SSAO * ssao;
GBuffer * gbuffer;
LightRender * lights;

de::GLUniform uAtlas {"uTex", de::GLUniform::Sampler2D};
de::GLUniform uCurrentTime {"uCurrentTime", de::GLUniform::Float};
de::GLUniform uLightMatrix {"uLightMatrix", de::GLUniform::Mat4};

void bind(de::GLProgram &) const;
void bindTo(de::GLProgram &) const;
};

} // namespace gloom
Expand Down
16 changes: 12 additions & 4 deletions doomsday/tests/test_gloom/gloom/render/entityrender.cpp
Expand Up @@ -44,7 +44,8 @@ DENG2_PIMPL(EntityRender)
{
EntityMap ents;
ModelDrawable entityModels[3];
GLProgram modelProgram;
GLProgram program;
GLProgram shadowProgram;

Impl(Public *i)
: Base(i)
Expand Down Expand Up @@ -83,14 +84,16 @@ DENG2_PIMPL(EntityRender)
{
model.load(pkg.root().locate<File>(filenames[idx]));
model.setAtlas(*context.atlas);
model.setProgram(&modelProgram);
model.setProgram(&program);
idx++;
}

GloomApp::shaders().build(modelProgram, "gloom.entity")
GloomApp::shaders().build(program, "gloom.entity")
<< context.view.uMvpMatrix
<< context.view.uWorldToViewMatrix
<< context.uAtlas;

GloomApp::shaders().build(shadowProgram, "gloom.shadow.entity");
}

void create()
Expand Down Expand Up @@ -165,7 +168,7 @@ EntityRender::EntityRender()
: d(new Impl(this))
{}

void EntityRender::glInit(const Context &context)
void EntityRender::glInit(Context &context)
{
Render::glInit(context);
d->init();
Expand All @@ -192,4 +195,9 @@ void EntityRender::render()
d->render();
}

void EntityRender::renderShadow()
{

}

} // namespace gloom
3 changes: 2 additions & 1 deletion doomsday/tests/test_gloom/gloom/render/entityrender.h
Expand Up @@ -32,9 +32,10 @@ class EntityRender : public Render
EntityMap &entityMap();
void createEntities();

void glInit(const Context &) override;
void glInit(Context &) override;
void glDeinit() override;
void render() override;
void renderShadow();

private:
DENG2_PRIVATE(d)
Expand Down
11 changes: 7 additions & 4 deletions doomsday/tests/test_gloom/gloom/render/gbuffer.cpp
Expand Up @@ -19,6 +19,7 @@
#include "gloom/render/gbuffer.h"
#include "gloom/render/screenquad.h"
#include "gloom/render/ssao.h"
#include "gloom/render/lightrender.h"

#include <de/Drawable>
#include <de/GLTextureFramebuffer>
Expand All @@ -39,6 +40,7 @@ DENG2_PIMPL(GBuffer)
GLUniform uGBufferNormal {"uGBufferNormal", GLUniform::Sampler2D};
GLUniform uGBufferDepth {"uGBufferDepth", GLUniform::Sampler2D};
GLUniform uSSAOBuf {"uSSAOBuf", GLUniform::Sampler2D};
GLUniform uShadowMap {"uShadowMap", GLUniform::Sampler2D}; // <----TESTING-----
GLUniform uDebugMode {"uDebugMode", GLUniform::Int};

Impl(Public *i) : Base(i)
Expand All @@ -64,14 +66,14 @@ GBuffer::GBuffer()
: d(new Impl(this))
{}

void GBuffer::glInit(const Context &context)
void GBuffer::glInit(Context &context)
{
Render::glInit(context);

d->quad.glInit(context);
context.shaders->build(d->quad.program(), "gloom.finalize")
<< context.view.uInverseProjMatrix
<< d->uGBufferAlbedo << d->uGBufferNormal << d->uGBufferDepth << d->uSSAOBuf
<< d->uDebugMode;
<< context.view.uInverseProjMatrix << d->uGBufferAlbedo << d->uGBufferNormal
<< d->uGBufferDepth << d->uSSAOBuf << d->uShadowMap << d->uDebugMode;

d->frame.glInit();
d->updateUniforms();
Expand Down Expand Up @@ -102,6 +104,7 @@ void GBuffer::clear()
void GBuffer::render()
{
d->uSSAOBuf = context().ssao->occlusionFactors();
d->uShadowMap = context().lights->shadowMap();

d->quad.state().setTarget(GLState::current().target());
d->quad.render();
Expand Down
2 changes: 1 addition & 1 deletion doomsday/tests/test_gloom/gloom/render/gbuffer.h
Expand Up @@ -34,7 +34,7 @@ class GBuffer : public Render
public:
GBuffer();

void glInit(const Context &) override;
void glInit(Context &) override;
void glDeinit() override;
void render() override;

Expand Down
7 changes: 6 additions & 1 deletion doomsday/tests/test_gloom/gloom/render/light.cpp
Expand Up @@ -48,14 +48,19 @@ Light::Light()
: d(new Impl(this))
{}

GLTexture &gloom::Light::shadowMap()
{
return d->shadowMap;
}

GLFramebuffer &Light::framebuf()
{
return d->framebuf;
}

Mat4f Light::lightMatrix() const
{
return Mat4f::ortho(-50, 50, -50, 50, 1, 200) *
return Mat4f::ortho(-3.5, 5.5, -9.5, 5.5, 50, 150) *
Mat4f::lookAt(d->origin + d->dir, d->origin, Vec3f(0, 1, 0));
}

Expand Down
60 changes: 46 additions & 14 deletions doomsday/tests/test_gloom/gloom/render/lightrender.cpp
Expand Up @@ -25,12 +25,12 @@ namespace gloom {

DENG2_PIMPL(LightRender)
{
Drawable * shadowGeometry = nullptr;
RenderFunc callback;
GLState state;
GLProgram program;
std::unique_ptr<Light> skyLight;
QHash<ID, std::shared_ptr<Light>> lights;
GLUniform uLightMatrix{"uLightMatrix", GLUniform::Mat4};
GLProgram surfaceProgram;
GLProgram entityProgram;

Impl(Public *i) : Base(i)
{}
Expand All @@ -45,7 +45,9 @@ DENG2_PIMPL(LightRender)

skyLight.reset(new Light);

self().context().shaders->build(program, "gloom.shadow") << uLightMatrix;
auto &ctx = self().context();
ctx.shaders->build(surfaceProgram, "gloom.shadow.surface") << ctx.uLightMatrix;
ctx.shaders->build(entityProgram, "gloom.shadow.entity") << ctx.uLightMatrix;
}

void glDeinit()
Expand All @@ -58,7 +60,7 @@ LightRender::LightRender()
: d(new Impl(this))
{}

void LightRender::glInit(const Context &context)
void LightRender::glInit(Context &context)
{
Render::glInit(context);
d->glInit();
Expand All @@ -72,31 +74,61 @@ void LightRender::glDeinit()

void LightRender::render()
{
auto &sg = *d->shadowGeometry;
//auto &sg = *d->shadowGeometry;

sg.setProgram(d->program);
sg.setState(d->state);
//sg.setProgram(d->program);
//sg.setState(d->state);

for (auto *light : {d->skyLight.get()})
{
light->framebuf().clear(GLFramebuffer::Depth);

d->state.setTarget(light->framebuf())
.setViewport(Rectangleui::fromSize(light->framebuf().size()));
d->uLightMatrix = light->lightMatrix();
sg.draw();

context().uLightMatrix = light->lightMatrix();

d->callback(*light);
// sg.draw();
}

sg.unsetState();
sg.setProgram(d->shadowGeometry->program());
//sg.unsetState();
//sg.setProgram(d->shadowGeometry->program());
}

void gloom::LightRender::setShadowGeometry(Drawable &sg)
void LightRender::setShadowRenderCallback(RenderFunc callback)
{
d->shadowGeometry = &sg;
d->callback = callback;
}

//void gloom::LightRender::setShadowGeometry(Drawable &sg)
//{
// d->shadowGeometry = &sg;
//}

void LightRender::createLights()
{

}

GLTexture &LightRender::shadowMap()
{
return d->skyLight->shadowMap();
}

GLProgram &LightRender::surfaceProgram()
{
return d->surfaceProgram;
}

GLProgram &LightRender::entityProgram()
{
return d->entityProgram;
}

GLState &LightRender::shadowState()
{
return d->state;
}

} // namespace gloom
14 changes: 12 additions & 2 deletions doomsday/tests/test_gloom/gloom/render/lightrender.h
Expand Up @@ -25,6 +25,8 @@

namespace gloom {

class Light;

/**
* Renders light source shadow maps and the deferred shading pass.
*/
Expand All @@ -33,13 +35,21 @@ class LightRender : public Render
public:
LightRender();

void glInit(const Context &) override;
void glInit(Context &) override;
void glDeinit() override;
void render() override;

void setShadowGeometry(de::Drawable &);
typedef std::function<void (const Light &)> RenderFunc;
void setShadowRenderCallback(RenderFunc callback);

//void setShadowGeometry(de::Drawable &);
void createLights();

de::GLTexture &shadowMap();
de::GLProgram &surfaceProgram();
de::GLProgram &entityProgram();
de::GLState &shadowState();

private:
DENG2_PRIVATE(d)
};
Expand Down

0 comments on commit a8614c7

Please sign in to comment.