载入中...
搜索中...
未找到
ContinuousArt.cpp
浏览该文件的文档.
2
3#include "common/Diagnostic.h"
4
5#include <algorithm>
6#include <cmath>
7
8#include <glm/vec3.hpp>
9
10namespace eve::graphics::fog {
11
13 auto ok01 = [](float v) { return std::isfinite(v) && v >= 0.f && v <= 2.f; };
14 if (!std::isfinite(params.colorTint.x) || !std::isfinite(params.colorTint.y) ||
15 !std::isfinite(params.colorTint.z) || params.colorTint.x < 0.f || params.colorTint.y < 0.f ||
16 params.colorTint.z < 0.f) {
18 DiagnosticCode::InvalidArgument, "colorTint must be finite and >= 0", "colorTint", {},
19 "graphics.fog"));
20 }
21 if (!ok01(params.edgeBoost) || !ok01(params.silhouetteSoftness) || !ok01(params.internalGlow) ||
22 !ok01(params.silverDust)) {
24 DiagnosticCode::InvalidArgument, "art scalars must be finite and in [0,2]", "art", {},
25 "graphics.fog"));
26 }
27 params_ = params;
28 return Result<void>::success();
29}
30
32 float neighborOpacity) const noexcept {
34 const float opacity = std::clamp(1.f - physical.transmittance, 0.f, 1.f);
35 out.opacity = opacity;
36 out.color = physical.inScatter * params_.colorTint;
37
38 const float depthCue = 1.f - std::exp(-std::max(viewZ, 0.f) * 0.05f);
39 out.edgeMask = std::clamp(std::fabs(opacity - neighborOpacity) * (0.5f + params_.edgeBoost), 0.f,
40 1.f);
41 out.edgeMask *= std::clamp(1.f - params_.silhouetteSoftness * depthCue, 0.f, 1.f);
42
43 const float glow = params_.internalGlow * opacity * (0.35f + 0.65f * depthCue);
44 out.color += glm::vec3(glow) * params_.colorTint;
45
46 // Silver dust: cool highlight on bright in-scatter without touching optics.
47 const float luma =
48 0.2126f * physical.inScatter.r + 0.7152f * physical.inScatter.g + 0.0722f * physical.inScatter.b;
49 out.dustHighlight = std::clamp(params_.silverDust * luma, 0.f, 1.f);
50 out.color += glm::vec3(0.85f, 0.9f, 1.f) * out.dustHighlight * 0.15f;
51 return out;
52}
53
54} // namespace eve::graphics::fog
Stable, structured diagnostics shared by engine modules.
float v
float opacity
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
const ContinuousArtParams & params() const noexcept
Params.
ContinuousArtOutput stylize(const FogRayResult &physical, float viewZ, float neighborOpacity=0.f) const noexcept
Stylize a physical fog integration result.
Result< void > setParams(const ContinuousArtParams &params)
Replace art parameters after validation.
std::vector< ParamSpec > params
Stylized fog presentation derived from a physical FogRayResult.
Definition FogTypes.h:169
Continuous-art stylization that never mutates density or optics.
Definition FogTypes.h:160
Optical result of integrating one view ray through fog.
Definition FogTypes.h:122