Cleanup DebugDeferredBuffer code

This commit is contained in:
Atlante45 2015-12-07 15:17:03 -08:00
parent 06d7de7106
commit 9d6618c341
4 changed files with 57 additions and 75 deletions

View file

@ -90,7 +90,6 @@ function menuItemEvent(menuItem) {
var index = ACTIONS.indexOf(menuItem); var index = ACTIONS.indexOf(menuItem);
if (index >= 0) { if (index >= 0) {
Scene.setEngineDeferredDebugMode(index - 1); Scene.setEngineDeferredDebugMode(index - 1);
print(menuItem);
} }
} }

View file

@ -11,8 +11,6 @@
#include "DebugDeferredBuffer.h" #include "DebugDeferredBuffer.h"
#include <QString>
#include <gpu/Batch.h> #include <gpu/Batch.h>
#include <gpu/Context.h> #include <gpu/Context.h>
#include <render/Scene.h> #include <render/Scene.h>
@ -31,73 +29,62 @@ enum Slots {
Normal, Normal,
Specular, Specular,
Depth, Depth,
Lighting, Lighting
NUM_SLOTS
}; };
static const std::array<std::string, Slots::NUM_SLOTS> SLOT_NAMES {{
"diffuseMap",
"normalMap",
"specularMap",
"depthMap",
"lightingMap"
}};
static const std::string COMPUTE_PLACEHOLDER { "/*COMPUTE_PLACEHOLDER*/" }; // required std::string DebugDeferredBuffer::getShaderSourceCode(Modes mode) {
static const std::string FUNCTIONS_PLACEHOLDER { "/*FUNCTIONS_PLACEHOLDER*/" }; // optional
std::string DebugDeferredBuffer::getCode(Modes mode) {
switch (mode) { switch (mode) {
case DiffuseMode: { case DiffuseMode:
QString code = "return vec4(pow(texture(%1, uv).xyz, vec3(1.0 / 2.2)), 1.0);"; return "vec4 getFragmentColor() { return vec4(pow(texture(diffuseMap, uv).xyz, vec3(1.0 / 2.2)), 1.0); }";
return code.arg(SLOT_NAMES[Diffuse].c_str()).toStdString(); case AlphaMode:
} return "vec4 getFragmentColor() { return vec4(vec3(texture(diffuseMap, uv).a), 1.0); }";
case AlphaMode: { case SpecularMode:
QString code = "return vec4(vec3(texture(%1, uv).a), 1.0);"; return "vec4 getFragmentColor() { return vec4(texture(specularMap, uv).xyz, 1.0); }";
return code.arg(SLOT_NAMES[Diffuse].c_str()).toStdString(); case RoughnessMode:
} return "vec4 getFragmentColor() { return vec4(vec3(texture(specularMap, uv).a), 1.0); }";
case SpecularMode: { case NormalMode:
QString code = "return vec4(texture(%1, uv).xyz, 1.0);"; return "vec4 getFragmentColor() { return vec4(texture(normalMap, uv).xyz, 1.0); }";
return code.arg(SLOT_NAMES[Specular].c_str()).toStdString(); case DepthMode:
} return "vec4 getFragmentColor() { return vec4(vec3(texture(depthMap, uv).x), 1.0); }";
case RoughnessMode: { case LightingMode:
QString code = "return vec4(vec3(texture(%1, uv).a), 1.0);"; return "vec4 getFragmentColor() { return vec4(pow(texture(lightingMap, uv).xyz, vec3(1.0 / 2.2)), 1.0); }";
return code.arg(SLOT_NAMES[Specular].c_str()).toStdString();
}
case NormalMode: {
QString code = "return vec4(texture(%1, uv).xyz, 1.0);";
return code.arg(SLOT_NAMES[Normal].c_str()).toStdString();
}
case DepthMode: {
QString code = "return vec4(vec3(texture(%1, uv).x), 1.0);";
return code.arg(SLOT_NAMES[Depth].c_str()).toStdString();
}
case LightingMode: {
QString code = "return vec4(pow(texture(%1, uv).xyz, vec3(1.0 / 2.2)), 1.0);";
return code.arg(SLOT_NAMES[Lighting].c_str()).toStdString();
}
case CustomMode: case CustomMode:
return std::string("return vec4(1.0);"); return "vec4 getFragmentColor() { return vec4(1.0); }";
case NUM_MODES:
Q_UNIMPLEMENTED();
return std::string("return vec4(1.0);");
} }
} }
bool DebugDeferredBuffer::pipelineNeedsUpdate(Modes mode) const {
if (mode != CustomMode) {
return !_pipelines[mode];
}
return true;
}
const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Modes mode) { const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Modes mode) {
if (!_pipelines[mode]) { if (pipelineNeedsUpdate(mode)) {
std::string fragmentShader = debug_deferred_buffer_frag; static const std::string VERTEX_SHADER { debug_deferred_buffer_vert };
fragmentShader.replace(fragmentShader.find(COMPUTE_PLACEHOLDER), COMPUTE_PLACEHOLDER.size(), static const std::string FRAGMENT_SHADER { debug_deferred_buffer_frag };
getCode(mode)); static const std::string SOURCE_PLACEHOLDER { "//SOURCE_PLACEHOLDER" };
static const auto SOURCE_PLACEHOLDER_INDEX = FRAGMENT_SHADER.find(SOURCE_PLACEHOLDER);
Q_ASSERT_X(SOURCE_PLACEHOLDER_INDEX != std::string::npos, Q_FUNC_INFO, "Could not find source placeholder");
auto vs = gpu::ShaderPointer(gpu::Shader::createVertex({ debug_deferred_buffer_vert })); auto bakedFragmentShader = FRAGMENT_SHADER;
auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(fragmentShader)); bakedFragmentShader.replace(SOURCE_PLACEHOLDER_INDEX, SOURCE_PLACEHOLDER.size(),
auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps)); getShaderSourceCode(mode));
const auto vs = gpu::Shader::createVertex(VERTEX_SHADER);
const auto ps = gpu::Shader::createPixel(bakedFragmentShader);
const auto program = gpu::Shader::createProgram(vs, ps);
gpu::Shader::BindingSet slotBindings; gpu::Shader::BindingSet slotBindings;
for (int slot = 0; slot < NUM_SLOTS; ++slot) { slotBindings.insert(gpu::Shader::Binding("diffuseMap", Diffuse));
slotBindings.insert(gpu::Shader::Binding(SLOT_NAMES[slot], slot)); slotBindings.insert(gpu::Shader::Binding("normalMap", Normal));
} slotBindings.insert(gpu::Shader::Binding("specularMap", Specular));
slotBindings.insert(gpu::Shader::Binding("depthMap", Depth));
slotBindings.insert(gpu::Shader::Binding("lightingMap", Lighting));
gpu::Shader::makeProgram(*program, slotBindings); gpu::Shader::makeProgram(*program, slotBindings);
// Good to go add the brand new pipeline // Good to go add the brand new pipeline
@ -110,10 +97,10 @@ const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Modes mode) {
void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {
assert(renderContext->args); assert(renderContext->args);
assert(renderContext->args->_viewFrustum); assert(renderContext->args->_viewFrustum);
RenderArgs* args = renderContext->args; const RenderArgs* args = renderContext->args;
gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { gpu::doInBatch(args->_context, [&](gpu::Batch& batch) {
auto geometryBuffer = DependencyManager::get<GeometryCache>(); const auto geometryBuffer = DependencyManager::get<GeometryCache>();
auto framebufferCache = DependencyManager::get<FramebufferCache>(); const auto framebufferCache = DependencyManager::get<FramebufferCache>();
glm::mat4 projMat; glm::mat4 projMat;
@ -132,9 +119,9 @@ void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const Ren
batch.setResourceTexture(Depth, framebufferCache->getPrimaryDepthTexture()); batch.setResourceTexture(Depth, framebufferCache->getPrimaryDepthTexture());
batch.setResourceTexture(Lighting, framebufferCache->getLightingTexture()); batch.setResourceTexture(Lighting, framebufferCache->getLightingTexture());
glm::vec4 color(1.0f, 1.0f, 1.0f, 1.0f); const glm::vec4 color(1.0f, 1.0f, 1.0f, 1.0f);
glm::vec2 bottomLeft(renderContext->_deferredDebugSize.x, renderContext->_deferredDebugSize.y); const glm::vec2 bottomLeft(renderContext->_deferredDebugSize.x, renderContext->_deferredDebugSize.y);
glm::vec2 topRight(renderContext->_deferredDebugSize.z, renderContext->_deferredDebugSize.w); const glm::vec2 topRight(renderContext->_deferredDebugSize.z, renderContext->_deferredDebugSize.w);
geometryBuffer->renderQuad(batch, bottomLeft, topRight, color); geometryBuffer->renderQuad(batch, bottomLeft, topRight, color);
}); });
} }

View file

@ -21,7 +21,7 @@ public:
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
private: private:
enum Modes : int { enum Modes : uint8_t {
DiffuseMode = 0, DiffuseMode = 0,
AlphaMode, AlphaMode,
SpecularMode, SpecularMode,
@ -29,15 +29,15 @@ private:
NormalMode, NormalMode,
DepthMode, DepthMode,
LightingMode, LightingMode,
CustomMode,
NUM_MODES CustomMode // Needs to stay last
}; };
bool pipelineNeedsUpdate(Modes mode) const;
const gpu::PipelinePointer& getPipeline(Modes mode); const gpu::PipelinePointer& getPipeline(Modes mode);
std::string getCode(Modes mode); std::string getShaderSourceCode(Modes mode);
std::array<gpu::PipelinePointer, NUM_MODES> _pipelines; std::array<gpu::PipelinePointer, CustomMode + 1> _pipelines;
}; };
#endif // hifi_DebugDeferredBuffer_h #endif // hifi_DebugDeferredBuffer_h

View file

@ -17,11 +17,7 @@
in vec2 uv; in vec2 uv;
out vec4 outFragColor; out vec4 outFragColor;
/*FUNCTIONS_PLACEHOLDER*/ //SOURCE_PLACEHOLDER
vec4 getFragmentColor() {
/*COMPUTE_PLACEHOLDER*/
}
void main(void) { void main(void) {
outFragColor = getFragmentColor(); outFragColor = getFragmentColor();