载入中...
搜索中...
未找到
PbrGpuUniform.cpp
浏览该文件的文档.
2
3#include <algorithm>
4
6
8 const auto& s = inputs.surface;
10 u.mvp = inputs.mvp;
11 u.model = inputs.model;
12 u.view = inputs.view;
13 u.camera = glm::vec4(inputs.camera, s.anisotropyRotation);
14 u.tint = inputs.tint;
15 u.ambient = glm::vec4(glm::vec3(inputs.ambient), s.anisotropyStrength);
16 u.material = {inputs.metallic, inputs.roughness, inputs.surfaceCode,
17 std::clamp(inputs.alphaCutoff + s.vegetationColor.globalAlphaThresholdOffset, 0.f, 1.f)};
18 u.emissive = {s.emissive[0], s.emissive[1], s.emissive[2], s.emissiveStrength};
19 u.specular = {s.specularColor[0], s.specularColor[1], s.specularColor[2], s.specularFactor};
20 u.coat = {s.clearcoatFactor, s.clearcoatRoughness, s.clearcoatNormalScale, s.ior};
21 u.colorMaskSecondary = {s.colorMaskSecondary[0], s.colorMaskSecondary[1], s.colorMaskSecondary[2],
22 float(s.normalMode)};
23 u.colorMaskParams = {s.colorMaskEnabled ? 1.f : 0.f, s.colorMaskMin, s.colorMaskMax,
24 s.albedoTextureStrength};
25 const auto& trans = s.translucency;
26 u.translucencyColor = {trans.color[0], trans.color[1], trans.color[2], trans.intensity};
27 u.translucencyParams = {trans.strength, trans.normalDistortion, trans.scattering, trans.direct};
28 u.translucencyLighting = {trans.ambient, trans.shadow, trans.maskAmount,
29 trans.globalIntensity * trans.overlay};
30 u.translucencyMask = {trans.maskMinimum, trans.maskMaximum, 0.f, 0.f};
31 u.motionHighlightColor = {s.motionHighlightColor[0], s.motionHighlightColor[1], s.motionHighlightColor[2],
32 s.vegetationColor.overlaySubsurface};
33 const auto& color = s.vegetationColor;
34 u.vegetationOverlay = {color.overlayColor[0], color.overlayColor[1], color.overlayColor[2], color.overlay};
35 u.vegetationWetness = {color.wetness, color.overlayNormalScale, color.wetnessNormalScale,
36 color.overlaySmoothness};
37 u.vegetationStageParams = {color.overlayVariation, color.overlayProjection, color.vertexOcclusionAlpha,
38 color.wetnessContrast};
39 u.vegetationFieldColor = {color.fieldColor[0], color.fieldColor[1], color.fieldColor[2], color.fieldColor[3]};
40 u.vegetationColorParams = {color.colorsCoverage, color.colorsIntensity, color.colorsMask, color.colorsVariation};
41 u.vegetationOcclusionParams = {color.vertexOcclusionMinimum, color.vertexOcclusionMaximum, 0.f, 0.f};
42 u.vegetationOcclusionColor = {color.vertexOcclusionColor[0], color.vertexOcclusionColor[1],
43 color.vertexOcclusionColor[2], float(color.backfaceNormalMode)};
44 u.vegetationGlobalMasks = {color.globalColorMaskMinimum, color.globalColorMaskMaximum,
45 color.globalOverlayMaskMinimum, color.globalOverlayMaskMaximum};
46 u.vegetationInfo.z = color.invertVertexOcclusion ? 1u : 0u;
47 u.vegetationInfo.w = color.invertVertexOcclusionColors ? 1u : 0u;
48
49 const auto& d = s.vegetationDetail;
50 u.detailUv = {d.uvScale[0], d.uvScale[1], d.uvOffset[0], d.uvOffset[1]};
51 u.detailColor = {d.color[0], d.color[1], d.color[2], d.normalBlendValue};
52 u.detailColorTwo = {d.colorTwo[0], d.colorTwo[1], d.colorTwo[2], d.colorTwo[3]};
53 u.detailValues = {d.value, d.normalValue, d.albedoValue, d.metallicValue};
54 u.detailMaterial = {d.occlusionValue, d.smoothnessValue, d.blendMinimum, d.blendMaximum};
55 u.detailMasks = {d.maskMinimum, d.maskMaximum, d.meshMinimum, d.meshMaximum};
56 u.detailInfo = {d.uvMode, d.colorMode, d.blendMode, d.alphaMode};
57 std::uint32_t detailPresent = 0;
58 for (std::size_t index = 0; index < d.textures.size(); ++index)
59 if (d.textures[index].texture) detailPresent |= 1u << index;
60 u.detailInfo2 = {d.maskMode, d.meshMode, d.inverseUvScale ? 1u : 0u, detailPresent};
61
62 const auto fillField = [](const auto& field, glm::vec4& coords,
63 glm::vec4& fallback, glm::vec4& usage0, glm::vec4& usage1,
64 glm::vec4& usage2) {
65 coords = {field.coords[0], field.coords[1], field.coords[2], field.coords[3]};
66 fallback = {field.fallback[0], field.fallback[1], field.fallback[2], field.fallback[3]};
67 usage0 = {field.usage[0], field.usage[1], field.usage[2], field.usage[3]};
68 usage1 = {field.usage[4], field.usage[5], field.usage[6], field.usage[7]};
69 usage2 = {field.usage[8], 0.f, 0.f, 0.f};
70 };
71 const auto& extras = s.vegetationExtras;
72 fillField(extras, u.extrasCoords, u.extrasFallback, u.extrasUsage0, u.extrasUsage1, u.extrasUsage2);
73 u.extrasInfo = {extras.layer, extras.usePivotPosition ? 1u : 0u, extras.texture ? 1u : 0u,
74 s.vegetationAlpha.enabled ? 1u : 0u};
75 u.extrasUsage2.y = s.vegetationAlpha.global;
76 u.extrasUsage2.z = s.vegetationAlpha.variation;
77 u.extrasUsage2.w = s.vegetationAlpha.detailFade ? 1.f : 0.f;
78 u.vegetationAlphaFade = {s.vegetationAlpha.glancing, s.vegetationAlpha.camera,
79 s.vegetationAlpha.constant, s.vegetationAlpha.noiseTiling};
80 u.vegetationAlphaCamera = {s.vegetationAlpha.cameraFadeMin, s.vegetationAlpha.cameraFadeMax, 0.f, 0.f};
81 u.vegetationEmission = {s.vegetationEmission.minimum, s.vegetationEmission.maximum,
82 s.vegetationEmission.phase,
83 s.vegetationEmission.enabled ? s.vegetationEmission.global : -1.f};
84 u.vegetationGradientOne = {s.vegetationGradient.colorOne[0], s.vegetationGradient.colorOne[1],
85 s.vegetationGradient.colorOne[2],
86 s.vegetationGradient.enabled ? s.vegetationGradient.minimum : -1.f};
87 u.vegetationGradientTwo = {s.vegetationGradient.colorTwo[0], s.vegetationGradient.colorTwo[1],
88 s.vegetationGradient.colorTwo[2], s.vegetationGradient.maximum};
89
90 const auto& colors = s.vegetationColors;
91 fillField(colors, u.colorsCoords, u.colorsFallback, u.colorsUsage0, u.colorsUsage1, u.colorsUsage2);
92 u.colorsInfo = {colors.layer, colors.usePivotPosition ? 1u : 0u, colors.texture ? 1u : 0u, 0u};
93 const auto& vertex = s.vegetationVertex;
94 fillField(vertex, u.vertexCoords, u.vertexFallback, u.vertexUsage0, u.vertexUsage1, u.vertexUsage2);
95 u.vertexSize = {vertex.globalSize, vertex.sizeFadeStart, vertex.sizeFadeEnd, vertex.distanceFadeBias};
96 u.vertexInfo = {vertex.layer, std::uint32_t(vertex.source), 0u, 0u};
97 const auto& motion = s.vegetationMotion;
98 fillField(motion, u.motionCoords, u.motionFallback, u.motionUsage0, u.motionUsage1, u.motionUsage2);
99 u.motionGlobal0 = {motion.globalDirection[0], motion.globalDirection[1], motion.worldOrigin[0],
100 motion.worldOrigin[1]};
101 u.motionGlobal1 = {motion.worldOrigin[2], motion.dynamicMode, motion.rigidity, motion.facing};
102 u.motionTime = {float(motion.time), 0.f, 0.f, 0.f};
103 u.motionBending = {motion.bending, motion.bendingSpeed, motion.bendingScale, motion.bendingVariation};
104 u.motionBranch = {motion.branch, motion.rolling, motion.branchSpeed, motion.branchScale};
105 u.motionBranch2 = {motion.branchVariation, motion.globalBending, motion.globalBranch, motion.globalFlutter};
106 u.motionFlutter = {motion.flutter, motion.flutterSpeed, motion.flutterScale, motion.flutterVariation};
107 u.motionControl = {motion.noiseTiling, motion.interaction, motion.interactionMask, motion.fadeDistance};
108 u.motionPerspective = {motion.perspectivePush, motion.perspectiveNoise, motion.perspectiveAngle, 0.f};
109 u.motionInfo = {motion.layer, std::uint32_t(motion.mode), 0u, 0u};
110
111 u.misc = {s.normalScale, s.occlusionStrength, s.unlit ? 1.f : 0.f, float(inputs.skinCount)};
112 for (int index = 0; index < std::min(inputs.lighting.count, 8); ++index)
113 u.lights[index] = inputs.lighting.lights[index];
114 u.lights[0].color.w = inputs.environmentIntensity;
115 for (std::size_t index = 0; index < s.textures.size(); ++index) {
116 const auto& binding = s.textures[index];
117 u.uvTransform[index] = {binding.offset[0], binding.offset[1], binding.scale[0], binding.scale[1]};
118 u.uvInfo[index] = {binding.rotation, UINT32_MAX, binding.texture ? 1.f : 0.f,
119 binding.srgbDecode ? 1.f : 0.f};
120 }
121 return u;
122}
123
124} // namespace eve::graphics::detail
const std::string & s
float u
Definition Grass.cpp:233
int inputs
Definition GridGraph.cpp:23
eve::action::ActionVfxBinding binding
float d
std::vector< float > colors
uint32_t index
PbrUniformGpu buildPbrUniformGpu(const PbrUniformBuildInputs &inputs)
Build all material and scene fields; mesh stream offsets remain disabled for the backend to fill.
Backend-neutral state needed to build one immutable PBR uniform snapshot.
Canonical std140 payload consumed by both generated PBR shader stages.
glm::vec4 color