12 #ifndef hifi_SubsurfaceScattering_h
13 #define hifi_SubsurfaceScattering_h
15 #include <DependencyManager.h>
17 #include "render/DrawTask.h"
18 #include "DeferredFrameTransform.h"
19 #include "DeferredFramebuffer.h"
20 #include "SurfaceGeometryPass.h"
21 #include "LightingModel.h"
23 class SubsurfaceScatteringResource {
25 using UniformBufferView = gpu::BufferView;
27 SubsurfaceScatteringResource();
29 void setBentNormalFactors(
const glm::vec4& rgbsBentFactors);
30 glm::vec4 getBentNormalFactors()
const;
32 void setCurvatureFactors(
const glm::vec2& sbCurvatureFactors);
33 glm::vec2 getCurvatureFactors()
const;
35 void setLevel(
float level);
36 float getLevel()
const;
39 void setShowBRDF(
bool show);
40 bool isShowBRDF()
const;
41 void setShowCurvature(
bool show);
42 bool isShowCurvature()
const;
43 void setShowDiffusedNormal(
bool show);
44 bool isShowDiffusedNormal()
const;
46 UniformBufferView getParametersBuffer()
const {
return _parametersBuffer; }
48 gpu::TexturePointer getScatteringProfile()
const {
return _scatteringProfile; }
49 gpu::TexturePointer getScatteringTable()
const {
return _scatteringTable; }
50 gpu::TexturePointer getScatteringSpecular()
const {
return _scatteringSpecular; }
52 void generateScatteringTable(RenderArgs* args);
54 static gpu::TexturePointer generateScatteringProfile(RenderArgs* args);
55 static gpu::TexturePointer generatePreIntegratedScattering(
const gpu::TexturePointer& profile, RenderArgs* args);
56 static gpu::TexturePointer generateScatteringSpecularBeckmann(RenderArgs* args);
65 glm::vec4 normalBentInfo{ 1.5f, 0.8f, 0.3f, 1.5f };
66 glm::vec2 curvatureInfo{ 0.08f, 0.8f };
68 float showBRDF{ 0.0f };
69 float showCurvature{ 0.0f };
70 float showDiffusedNormal{ 0.0f };
77 UniformBufferView _parametersBuffer;
81 gpu::TexturePointer _scatteringProfile;
82 gpu::TexturePointer _scatteringTable;
83 gpu::TexturePointer _scatteringSpecular;
86 using SubsurfaceScatteringResourcePointer = std::shared_ptr<SubsurfaceScatteringResource>;
90 class SubsurfaceScatteringConfig :
public render::Job::Config {
92 Q_PROPERTY(
float bentRed MEMBER bentRed NOTIFY dirty)
93 Q_PROPERTY(
float bentGreen MEMBER bentGreen NOTIFY dirty)
94 Q_PROPERTY(
float bentBlue MEMBER bentBlue NOTIFY dirty)
95 Q_PROPERTY(
float bentScale MEMBER bentScale NOTIFY dirty)
97 Q_PROPERTY(
float curvatureOffset MEMBER curvatureOffset NOTIFY dirty)
98 Q_PROPERTY(
float curvatureScale MEMBER curvatureScale NOTIFY dirty)
100 Q_PROPERTY(
bool enableScattering MEMBER enableScattering NOTIFY dirty)
101 Q_PROPERTY(
bool showScatteringBRDF MEMBER showScatteringBRDF NOTIFY dirty)
102 Q_PROPERTY(
bool showCurvature MEMBER showCurvature NOTIFY dirty)
103 Q_PROPERTY(
bool showDiffusedNormal MEMBER showDiffusedNormal NOTIFY dirty)
106 SubsurfaceScatteringConfig() : render::Job::Config(true) {}
108 float bentRed{ 1.5f };
109 float bentGreen{ 0.8f };
110 float bentBlue{ 0.3f };
111 float bentScale{ 1.5f };
113 float curvatureOffset{ 0.08f };
114 float curvatureScale{ 0.9f };
116 bool enableScattering{
true };
117 bool showScatteringBRDF{
false };
118 bool showCurvature{
false };
119 bool showDiffusedNormal{
false };
125 class SubsurfaceScattering {
128 using Outputs = SubsurfaceScatteringResourcePointer;
129 using Config = SubsurfaceScatteringConfig;
130 using JobModel = render::Job::ModelO<SubsurfaceScattering, Outputs, Config>;
132 SubsurfaceScattering();
134 void configure(
const Config& config);
135 void run(
const render::RenderContextPointer& renderContext, Outputs& outputs);
138 SubsurfaceScatteringResourcePointer _scatteringResource;
143 class DebugSubsurfaceScatteringConfig :
public render::Job::Config {
146 Q_PROPERTY(
bool showProfile MEMBER showProfile NOTIFY dirty)
147 Q_PROPERTY(
bool showLUT MEMBER showLUT NOTIFY dirty)
148 Q_PROPERTY(
bool showSpecularTable MEMBER showSpecularTable NOTIFY dirty)
149 Q_PROPERTY(
bool showCursorPixel MEMBER showCursorPixel NOTIFY dirty)
150 Q_PROPERTY(glm::vec2 debugCursorTexcoord MEMBER debugCursorTexcoord NOTIFY dirty)
152 DebugSubsurfaceScatteringConfig() : render::Job::Config(false) {}
154 bool showProfile{
false };
155 bool showLUT{
false };
156 bool showSpecularTable{
false };
157 bool showCursorPixel{
false };
158 glm::vec2 debugCursorTexcoord{ 0.5, 0.5 };
164 class DebugSubsurfaceScattering {
166 using Inputs = render::VaryingSet6<DeferredFrameTransformPointer, DeferredFramebufferPointer, LightingModelPointer, SurfaceGeometryFramebufferPointer, gpu::FramebufferPointer, SubsurfaceScatteringResourcePointer>;
167 using Config = DebugSubsurfaceScatteringConfig;
168 using JobModel = render::Job::ModelI<DebugSubsurfaceScattering, Inputs, Config>;
170 DebugSubsurfaceScattering();
172 void configure(
const Config& config);
173 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs);
177 gpu::PipelinePointer _scatteringPipeline;
178 gpu::PipelinePointer getScatteringPipeline();
180 gpu::PipelinePointer _showLUTPipeline;
181 gpu::PipelinePointer getShowLUTPipeline();
182 gpu::BufferPointer _debugParams;
183 bool _showProfile{
false };
184 bool _showLUT{
false };
185 bool _showSpecularTable{
false };
186 bool _showCursorPixel{
false };
187 glm::vec2 _debugCursorTexcoord;