Use named passes

This commit is contained in:
Vincent Lejeune
2014-01-25 22:38:24 +01:00
parent e6c419e695
commit 2e6f95712c
5 changed files with 33 additions and 24 deletions

View File

@@ -141,12 +141,12 @@ void IrrDriver::reset()
if (m_glsl) m_post_processing->reset();
} // reset
void IrrDriver::setPhase(unsigned p)
void IrrDriver::setPhase(STKRenderingPass p)
{
phase = p;
}
unsigned IrrDriver::getPhase() const
STKRenderingPass IrrDriver::getPhase() const
{
return phase;
}

View File

@@ -63,6 +63,16 @@ class PostProcessing;
class LightNode;
class ShadowImportance;
enum STKRenderingPass
{
SOLID_NORMAL_AND_DEPTH_PASS,
SOLID_LIT_PASS,
TRANSPARENT_PASS,
GLOW_PASS,
DISPLACEMENT_PASS,
SHADOW_PASS
};
/**
* \brief class that creates the irrLicht device and offers higher-level
* ways to manage the 3D scene
@@ -174,7 +184,7 @@ private:
std::vector<scene::ISceneNode *> m_background;
unsigned phase;
STKRenderingPass phase;
#ifdef DEBUG
/** Used to visualise skeletons. */
@@ -208,8 +218,8 @@ public:
~IrrDriver();
void initDevice();
void reset();
void setPhase(unsigned);
unsigned getPhase() const;
void setPhase(STKRenderingPass);
STKRenderingPass getPhase() const;
core::array<video::IRenderTarget> &getMainSetup();
void updateConfigIfRelevant();
void setAllMaterialFlags(scene::IMesh *mesh) const;

View File

@@ -191,10 +191,9 @@ void IrrDriver::renderGLSL(float dt)
// Fire up the MRT
m_video_driver->setRenderTarget(m_mrt, false, false);
PROFILER_PUSH_CPU_MARKER("- Solid Pass 1", 0xFF, 0x00, 0x00);
m_renderpass = scene::ESNRP_CAMERA | scene::ESNRP_SOLID;
irr_driver->setPhase(0);
irr_driver->setPhase(SOLID_NORMAL_AND_DEPTH_PASS);
m_scene_manager->drawAll(m_renderpass);
irr_driver->setProjMatrix(irr_driver->getVideoDriver()->getTransform(video::ETS_PROJECTION));
irr_driver->setViewMatrix(irr_driver->getVideoDriver()->getTransform(video::ETS_VIEW));
@@ -225,7 +224,7 @@ void IrrDriver::renderGLSL(float dt)
PROFILER_POP_CPU_MARKER();
PROFILER_PUSH_CPU_MARKER("- Solid Pass 2", 0x00, 0x00, 0xFF);
irr_driver->setPhase(1);
irr_driver->setPhase(SOLID_LIT_PASS);
m_renderpass = scene::ESNRP_CAMERA | scene::ESNRP_SOLID;
m_scene_manager->drawAll(m_renderpass);
@@ -243,7 +242,7 @@ void IrrDriver::renderGLSL(float dt)
// Render anything glowing.
if (!m_mipviz && !m_wireframe)
{
irr_driver->setPhase(2);
irr_driver->setPhase(GLOW_PASS);
renderGlow(overridemat, glows, cambox, cam);
} // end glow
@@ -289,10 +288,9 @@ void IrrDriver::renderGLSL(float dt)
}
PROFILER_POP_CPU_MARKER();
// We need to re-render camera due to the per-cam-node hack.
PROFILER_PUSH_CPU_MARKER("- Transparent Pass", 0xFF, 0x00, 0x00);
irr_driver->setPhase(3);
irr_driver->setPhase(TRANSPARENT_PASS);
m_renderpass = scene::ESNRP_CAMERA | scene::ESNRP_TRANSPARENT;
m_scene_manager->drawAll(m_renderpass);
PROFILER_POP_CPU_MARKER();
@@ -835,7 +833,7 @@ void IrrDriver::renderDisplacement(video::SOverrideMaterial &overridemat,
cb->update();
const int displacingcount = m_displacing.size();
irr_driver->setPhase(4);
irr_driver->setPhase(DISPLACEMENT_PASS);
for (int i = 0; i < displacingcount; i++)
{

View File

@@ -28,7 +28,7 @@ void STKAnimatedMesh::drawSolid(const GLMesh &mesh, video::E_MATERIAL_TYPE type)
{
switch (irr_driver->getPhase())
{
case 0:
case SOLID_NORMAL_AND_DEPTH_PASS:
{
irr_driver->getVideoDriver()->setRenderTarget(irr_driver->getRTT(RTT_NORMAL_AND_DEPTH), false, false);
@@ -47,7 +47,7 @@ void STKAnimatedMesh::drawSolid(const GLMesh &mesh, video::E_MATERIAL_TYPE type)
irr_driver->getVideoDriver()->setRenderTarget(irr_driver->getMainSetup(), false, false);
break;
}
case 1:
case SOLID_LIT_PASS:
{
irr_driver->getVideoDriver()->setRenderTarget(irr_driver->getRTT(RTT_COLOR), false, false);
@@ -134,7 +134,7 @@ void STKAnimatedMesh::render()
if (isObjectPass(material.MaterialType))
{
initvaostate(GLmeshes[i], material.MaterialType);
if (irr_driver->getPhase() == 0)
if (irr_driver->getPhase() == SOLID_NORMAL_AND_DEPTH_PASS)
{
glBindBuffer(GL_ARRAY_BUFFER, GLmeshes[i].vertex_buffer);
glBufferSubData(GL_ARRAY_BUFFER, 0, mb->getVertexCount() * GLmeshes[i].Stride, mb->getVertices());

View File

@@ -624,6 +624,7 @@ void STKMesh::drawDisplace(const GLMesh &mesh)
void STKMesh::drawTransparent(const GLMesh &mesh, video::E_MATERIAL_TYPE type)
{
assert(irr_driver->getPhase() == TRANSPARENT_PASS);
glEnable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);
glDepthMask(GL_FALSE);
@@ -643,7 +644,7 @@ void STKMesh::drawSolid(const GLMesh &mesh, video::E_MATERIAL_TYPE type)
{
switch (irr_driver->getPhase())
{
case 0:
case SOLID_NORMAL_AND_DEPTH_PASS:
{
windDir = getWind();
irr_driver->getVideoDriver()->setRenderTarget(irr_driver->getRTT(RTT_NORMAL_AND_DEPTH), false, false);
@@ -667,7 +668,7 @@ void STKMesh::drawSolid(const GLMesh &mesh, video::E_MATERIAL_TYPE type)
irr_driver->getVideoDriver()->setRenderTarget(irr_driver->getMainSetup(), false, false);
break;
}
case 1:
case SOLID_LIT_PASS:
{
irr_driver->getVideoDriver()->setRenderTarget(irr_driver->getRTT(RTT_COLOR), false, false);
@@ -728,7 +729,7 @@ void initvaostate(GLMesh &mesh, video::E_MATERIAL_TYPE type)
{
switch (irr_driver->getPhase())
{
case 0: // Solid Pass 1
case SOLID_NORMAL_AND_DEPTH_PASS:
if (mesh.vao_first_pass)
return;
if (type == irr_driver->getShader(ES_NORMAL_MAP))
@@ -752,7 +753,7 @@ void initvaostate(GLMesh &mesh, video::E_MATERIAL_TYPE type)
MeshShader::ObjectPass1Shader::attrib_position, -1, -1, MeshShader::ObjectPass1Shader::attrib_normal, -1, -1, -1, mesh.Stride);
}
return;
case 1: // Solid pass 2
case SOLID_LIT_PASS:
if (mesh.vao_second_pass)
return;
if (type == irr_driver->getShader(ES_SPHERE_MAP))
@@ -791,12 +792,12 @@ void initvaostate(GLMesh &mesh, video::E_MATERIAL_TYPE type)
MeshShader::ObjectPass2Shader::attrib_position, MeshShader::ObjectPass2Shader::attrib_texcoord, -1, -1, -1, -1, -1, mesh.Stride);
}
return;
case 2: // Glow
case GLOW_PASS:
if (mesh.vao_glow_pass)
return;
mesh.vao_glow_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::ColorizeShader::attrib_position, -1, -1, -1, -1, -1, -1, mesh.Stride);
return;
case 3: // Transparent
case TRANSPARENT_PASS:
if (mesh.vao_first_pass)
return;
if (type == irr_driver->getShader(ES_BUBBLES))
@@ -810,7 +811,7 @@ void initvaostate(GLMesh &mesh, video::E_MATERIAL_TYPE type)
MeshShader::TransparentShader::attrib_position, MeshShader::TransparentShader::attrib_texcoord, -1, -1, -1, -1, -1, mesh.Stride);
}
return;
case 4:
case DISPLACEMENT_PASS:
if (mesh.vao_displace_pass)
return;
mesh.vao_displace_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::DisplaceShader::attrib_position, MeshShader::DisplaceShader::attrib_texcoord, MeshShader::DisplaceShader::attrib_second_texcoord, -1, -1, -1, -1, mesh.Stride);
@@ -845,7 +846,7 @@ void STKMesh::render()
if (isTransparentPass != transparent)
continue;
if (irr_driver->getPhase() == 4)
if (irr_driver->getPhase() == DISPLACEMENT_PASS)
{
initvaostate(GLmeshes[i], material.MaterialType);
drawDisplace(GLmeshes[i]);
@@ -860,7 +861,7 @@ void STKMesh::render()
// only render transparent buffer if this is the transparent render pass
// and solid only in solid pass
if (irr_driver->getPhase() == 2)
if (irr_driver->getPhase() == GLOW_PASS)
{
initvaostate(GLmeshes[i], material.MaterialType);
drawGlow(GLmeshes[i]);