Collect stats on translucent/opaque mesh parts

This commit is contained in:
Atlante45 2015-06-04 18:46:47 +02:00
parent 8e21d9c14b
commit 93b44e6846
4 changed files with 64 additions and 11 deletions

View file

@ -475,8 +475,22 @@ void Stats::display(
if (_expanded) { if (_expanded) {
octreeStats.str(""); octreeStats.str("");
octreeStats << " Mesh Parts Rendered Opaque: " << _renderDetails._opaqueMeshPartsRendered octreeStats << " Mesh Parts Rendered Opaque: " << _renderDetails._opaque._rendered
<< " / Translucent:" << _renderDetails._translucentMeshPartsRendered; << " / Translucent:" << _renderDetails._translucent._rendered;
verticalOffset += STATS_PELS_PER_LINE;
drawText(horizontalOffset, verticalOffset, scale, rotation, font, (char*)octreeStats.str().c_str(), color);
octreeStats.str("");
octreeStats << " Opaque considered: " << _renderDetails._opaque._considered
<< " / Out of view:" << _renderDetails._opaque._outOfView
<< " / Too small:" << _renderDetails._opaque._tooSmall;
verticalOffset += STATS_PELS_PER_LINE;
drawText(horizontalOffset, verticalOffset, scale, rotation, font, (char*)octreeStats.str().c_str(), color);
octreeStats.str("");
octreeStats << " Translucent considered: " << _renderDetails._translucent._considered
<< " / Out of view:" << _renderDetails._translucent._outOfView
<< " / Too small:" << _renderDetails._translucent._tooSmall;
verticalOffset += STATS_PELS_PER_LINE; verticalOffset += STATS_PELS_PER_LINE;
drawText(horizontalOffset, verticalOffset, scale, rotation, font, (char*)octreeStats.str().c_str(), color); drawText(horizontalOffset, verticalOffset, scale, rotation, font, (char*)octreeStats.str().c_str(), color);
} }

View file

@ -2216,12 +2216,6 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran
const int INDICES_PER_QUAD = 4; const int INDICES_PER_QUAD = 4;
args->_details._trianglesRendered += part.triangleIndices.size() / INDICES_PER_TRIANGLE; args->_details._trianglesRendered += part.triangleIndices.size() / INDICES_PER_TRIANGLE;
args->_details._quadsRendered += part.quadIndices.size() / INDICES_PER_QUAD; args->_details._quadsRendered += part.quadIndices.size() / INDICES_PER_QUAD;
if (translucent) {
args->_details._translucentMeshPartsRendered++;
} else {
args->_details._opaqueMeshPartsRendered++;
}
} }
} }

View file

@ -63,7 +63,10 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont
auto& scene = sceneContext->_scene; auto& scene = sceneContext->_scene;
RenderArgs* args = renderContext->args; RenderArgs* args = renderContext->args;
auto renderDetails = renderContext->args->_details._item;
renderDetails->_considered += inItems.size();
// Culling / LOD // Culling / LOD
for (auto id : inItems) { for (auto id : inItems) {
auto item = scene->getItem(id); auto item = scene->getItem(id);
@ -81,9 +84,14 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont
bool bigEnoughToRender = (args->_shouldRender) ? args->_shouldRender(args, bound) : true; bool bigEnoughToRender = (args->_shouldRender) ? args->_shouldRender(args, bound) : true;
if (bigEnoughToRender) { if (bigEnoughToRender) {
outItems.push_back(id); // One more Item to render outItems.push_back(id); // One more Item to render
} else {
renderDetails->_tooSmall++;
} }
} else {
renderDetails->_outOfView++;
} }
} }
renderDetails->_rendered += outItems.size();
} }
struct ItemBound { struct ItemBound {
@ -220,6 +228,7 @@ template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer
// render opaques // render opaques
auto& scene = sceneContext->_scene; auto& scene = sceneContext->_scene;
auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape()); auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape());
auto& renderDetails = renderContext->args->_details;
ItemIDs inItems; ItemIDs inItems;
inItems.reserve(items.size()); inItems.reserve(items.size());
@ -232,7 +241,9 @@ template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer
ItemIDs culledItems; ItemIDs culledItems;
if (renderContext->_cullOpaque) { if (renderContext->_cullOpaque) {
renderDetails.pointTo(RenderDetails::OPAQUE);
cullItems(sceneContext, renderContext, renderedItems, culledItems); cullItems(sceneContext, renderContext, renderedItems, culledItems);
renderDetails.pointTo(RenderDetails::OTHER);
renderedItems = culledItems; renderedItems = culledItems;
} }
@ -283,6 +294,7 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo
// render transparents // render transparents
auto& scene = sceneContext->_scene; auto& scene = sceneContext->_scene;
auto& items = scene->getMasterBucket().at(ItemFilter::Builder::transparentShape()); auto& items = scene->getMasterBucket().at(ItemFilter::Builder::transparentShape());
auto& renderDetails = renderContext->args->_details;
ItemIDs inItems; ItemIDs inItems;
inItems.reserve(items.size()); inItems.reserve(items.size());
@ -295,7 +307,9 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo
ItemIDs culledItems; ItemIDs culledItems;
if (renderContext->_cullTransparent) { if (renderContext->_cullTransparent) {
renderDetails.pointTo(RenderDetails::TRANSLUCENT);
cullItems(sceneContext, renderContext, inItems, culledItems); cullItems(sceneContext, renderContext, inItems, culledItems);
renderDetails.pointTo(RenderDetails::OTHER);
renderedItems = culledItems; renderedItems = culledItems;
} }

View file

@ -22,13 +22,44 @@ class Batch;
class Context; class Context;
} }
struct RenderDetails { class RenderDetails {
public:
enum Type {
OPAQUE,
TRANSLUCENT,
OTHER
};
struct Items {
int _considered = 0;
int _rendered = 0;
int _outOfView = 0;
int _tooSmall = 0;
};
int _materialSwitches = 0; int _materialSwitches = 0;
int _trianglesRendered = 0; int _trianglesRendered = 0;
int _quadsRendered = 0; int _quadsRendered = 0;
int _translucentMeshPartsRendered = 0; Items _opaque;
int _opaqueMeshPartsRendered = 0; Items _translucent;
Items _other;
Items* _item = &_other;
void pointTo(Type type) {
switch (type) {
case OPAQUE:
_item = &_opaque;
break;
case TRANSLUCENT:
_item = &_translucent;
break;
case OTHER:
_item = &_other;
break;
}
}
}; };
class RenderArgs { class RenderArgs {