migrating the transparent pipeline

This commit is contained in:
Sam Gateau 2015-06-16 17:33:53 +02:00
parent b1ff877af1
commit d1ac3148f0
4 changed files with 54 additions and 14 deletions

View file

@ -1795,6 +1795,7 @@ AABox Model::getPartBounds(int meshIndex, int partIndex) {
}
void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool translucent) {
PerformanceTimer perfTimer("Model::renderPart");
if (!_readyWhenAdded) {
return; // bail asap

View file

@ -57,7 +57,7 @@ RenderDeferredTask::RenderDeferredTask() : Task() {
RenderDeferredTask::RenderDeferredTask() : Task() {
_jobs.push_back(Job(new PrepareDeferred::JobModel()));
_jobs.push_back(Job(new DrawBackground::JobModel()));
_jobs.push_back(Job(new FetchItems::JobModel()));
_jobs.push_back(Job(new FetchItems::JobModel(FetchItems())));
_jobs.push_back(Job(new CullItems::JobModel(_jobs.back().getOutput())));
_jobs.push_back(Job(new DepthSortItems::JobModel(_jobs.back().getOutput())));
_jobs.push_back(Job(new DrawOpaqueDeferred::JobModel(_jobs.back().getOutput())));
@ -65,7 +65,10 @@ RenderDeferredTask::RenderDeferredTask() : Task() {
_jobs.push_back(Job(new ResetGLState::JobModel()));
_jobs.push_back(Job(new RenderDeferred::JobModel()));
_jobs.push_back(Job(new ResolveDeferred::JobModel()));
_jobs.push_back(Job(new DrawTransparentDeferred::JobModel()));
_jobs.push_back(Job(new FetchItems::JobModel(FetchItems(ItemFilter::Builder::transparentShape().withoutLayered()))));
_jobs.push_back(Job(new CullItems::JobModel(_jobs.back().getOutput())));
_jobs.push_back(Job(new DepthSortItems::JobModel(_jobs.back().getOutput())));
_jobs.push_back(Job(new DrawTransparentDeferred::JobModel(_jobs.back().getOutput())));
_jobs.push_back(Job(new DrawPostLayered::JobModel()));
_jobs.push_back(Job(new ResetGLState::JobModel()));
}
@ -209,7 +212,7 @@ void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const Rend
args->_context->render((*args->_batch));
args->_batch = nullptr;
}
/*
void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {
PerformanceTimer perfTimer("DrawTransparentDeferred");
assert(renderContext->args);
@ -288,4 +291,44 @@ void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const
// reset blend function to standard...
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE);
}
}
}*/
void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems) {
PerformanceTimer perfTimer("DrawTransparentDeferred");
assert(renderContext->args);
assert(renderContext->args->_viewFrustum);
auto& renderDetails = renderContext->args->_details;
RenderArgs* args = renderContext->args;
gpu::Batch batch;
args->_batch = &batch;
glm::mat4 projMat;
Transform viewMat;
args->_viewFrustum->evalProjectionMatrix(projMat);
args->_viewFrustum->evalViewTransform(viewMat);
if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) {
viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f));
}
batch.setProjectionTransform(projMat);
batch.setViewTransform(viewMat);
const float TRANSPARENT_ALPHA_THRESHOLD = 0.0f;
{
GLenum buffers[3];
int bufferCount = 0;
buffers[bufferCount++] = GL_COLOR_ATTACHMENT0;
batch._glDrawBuffers(bufferCount, buffers);
args->_alphaThreshold = TRANSPARENT_ALPHA_THRESHOLD;
}
renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnTransparentItems);
args->_context->render((*args->_batch));
args->_batch = nullptr;
// reset blend function to standard...
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE);
}

View file

@ -43,19 +43,11 @@ public:
typedef render::Job::ModelI<DrawOpaqueDeferred, render::ItemIDsBounds> JobModel;
};
/*class DrawOpaqueDeferred {
public:
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
typedef render::Job::Model<DrawOpaqueDeferred> JobModel;
};
*/
class DrawTransparentDeferred {
public:
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const render::ItemIDsBounds& inItems);
typedef render::Job::Model<DrawTransparentDeferred> JobModel;
typedef render::Job::ModelI<DrawTransparentDeferred, render::ItemIDsBounds> JobModel;
};
class RenderDeferredTask : public render::Task {

View file

@ -186,6 +186,10 @@ void renderItems(const SceneContextPointer& sceneContext, const RenderContextPoi
class FetchItems {
public:
FetchItems() {}
FetchItems(const ItemFilter& filter): _filter(filter) {}
ItemFilter _filter = ItemFilter::Builder::opaqueShape().withoutLayered();
void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, ItemIDsBounds& outItems);