Overte C++ Documentation
SubsurfaceScattering.h
1 //
2 // SubsurfaceScattering.h
3 // libraries/render-utils/src/
4 //
5 // Created by Sam Gateau 6/3/2016.
6 // Copyright 2016 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #ifndef hifi_SubsurfaceScattering_h
13 #define hifi_SubsurfaceScattering_h
14 
15 #include <DependencyManager.h>
16 
17 #include "render/DrawTask.h"
18 #include "DeferredFrameTransform.h"
19 #include "DeferredFramebuffer.h"
20 #include "SurfaceGeometryPass.h"
21 #include "LightingModel.h"
22 
23 class SubsurfaceScatteringResource {
24 public:
25  using UniformBufferView = gpu::BufferView;
26 
27  SubsurfaceScatteringResource();
28 
29  void setBentNormalFactors(const glm::vec4& rgbsBentFactors);
30  glm::vec4 getBentNormalFactors() const;
31 
32  void setCurvatureFactors(const glm::vec2& sbCurvatureFactors);
33  glm::vec2 getCurvatureFactors() const;
34 
35  void setLevel(float level);
36  float getLevel() const;
37 
38 
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;
45 
46  UniformBufferView getParametersBuffer() const { return _parametersBuffer; }
47 
48  gpu::TexturePointer getScatteringProfile() const { return _scatteringProfile; }
49  gpu::TexturePointer getScatteringTable() const { return _scatteringTable; }
50  gpu::TexturePointer getScatteringSpecular() const { return _scatteringSpecular; }
51 
52  void generateScatteringTable(RenderArgs* args);
53 
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);
57 
58 protected:
59 
60 
61  // Class describing the uniform buffer with the transform info common to the AO shaders
62  // It s changing every frame
63  class Parameters {
64  public:
65  glm::vec4 normalBentInfo{ 1.5f, 0.8f, 0.3f, 1.5f };
66  glm::vec2 curvatureInfo{ 0.08f, 0.8f };
67  float level{ 1.0f };
68  float showBRDF{ 0.0f };
69  float showCurvature{ 0.0f };
70  float showDiffusedNormal{ 0.0f };
71  float spare1{ 0.0f };
72  float spare2{ 0.0f };
73 
74 
75  Parameters() {}
76  };
77  UniformBufferView _parametersBuffer;
78 
79 
80 
81  gpu::TexturePointer _scatteringProfile;
82  gpu::TexturePointer _scatteringTable;
83  gpu::TexturePointer _scatteringSpecular;
84 };
85 
86 using SubsurfaceScatteringResourcePointer = std::shared_ptr<SubsurfaceScatteringResource>;
87 
88 
89 
90 class SubsurfaceScatteringConfig : public render::Job::Config {
91  Q_OBJECT
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)
96 
97  Q_PROPERTY(float curvatureOffset MEMBER curvatureOffset NOTIFY dirty)
98  Q_PROPERTY(float curvatureScale MEMBER curvatureScale NOTIFY dirty)
99 
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)
104 
105 public:
106  SubsurfaceScatteringConfig() : render::Job::Config(true) {}
107 
108  float bentRed{ 1.5f };
109  float bentGreen{ 0.8f };
110  float bentBlue{ 0.3f };
111  float bentScale{ 1.5f };
112 
113  float curvatureOffset{ 0.08f };
114  float curvatureScale{ 0.9f };
115 
116  bool enableScattering{ true };
117  bool showScatteringBRDF{ false };
118  bool showCurvature{ false };
119  bool showDiffusedNormal{ false };
120 
121 signals:
122  void dirty();
123 };
124 
125 class SubsurfaceScattering {
126 public:
127  //using Inputs = render::VaryingSet4<DeferredFrameTransformPointer, gpu::FramebufferPointer, gpu::FramebufferPointer, SubsurfaceScatteringResourcePointer>;
128  using Outputs = SubsurfaceScatteringResourcePointer;
129  using Config = SubsurfaceScatteringConfig;
130  using JobModel = render::Job::ModelO<SubsurfaceScattering, Outputs, Config>;
131 
132  SubsurfaceScattering();
133 
134  void configure(const Config& config);
135  void run(const render::RenderContextPointer& renderContext, Outputs& outputs);
136 
137 private:
138  SubsurfaceScatteringResourcePointer _scatteringResource;
139 };
140 
141 
142 
143 class DebugSubsurfaceScatteringConfig : public render::Job::Config {
144  Q_OBJECT
145 
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)
151 public:
152  DebugSubsurfaceScatteringConfig() : render::Job::Config(false) {}
153 
154  bool showProfile{ false };
155  bool showLUT{ false };
156  bool showSpecularTable{ false };
157  bool showCursorPixel{ false };
158  glm::vec2 debugCursorTexcoord{ 0.5, 0.5 };
159 
160 signals:
161  void dirty();
162 };
163 
164 class DebugSubsurfaceScattering {
165 public:
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>;
169 
170  DebugSubsurfaceScattering();
171 
172  void configure(const Config& config);
173  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs);
174 
175 private:
176 
177  gpu::PipelinePointer _scatteringPipeline;
178  gpu::PipelinePointer getScatteringPipeline();
179 
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;
188 };
189 
190 #endif // hifi_SubsurfaceScattering_h