载入中...
搜索中...
未找到
HairShader.cpp
浏览该文件的文档.
2
3#include "common/Exception.h"
4#include "graphics/Graphics.h"
5#include "graphics/Shader.h"
6#include "graphics/shaders/mesh3d_hair_frag_spv.inc"
7#include "graphics/shaders/mesh3d_hair_vert_spv.inc"
8
9#include <array>
10#include <vector>
11
13namespace {
14
15const std::array<const char *, 9> kParams = {"specExp", "specStrength", "primaryShift",
16 "secondaryShift", "alphaCutoff", "rimStrength",
17 "strandDirX", "strandDirY", "strandDirZ"};
18
19std::vector<uint32_t> copySpv(const uint32_t *data, size_t count) {
20 return std::vector<uint32_t>(data, data + count);
21}
22
23} // namespace
24
25int paramCount() { return int(kParams.size()); }
26
27std::string paramName(int index) {
28 if (index < 0 || index >= int(kParams.size())) return {};
29 return kParams[size_t(index)];
30}
31
33 if (!shader) throw eve::Exception("hair::bindDefaults: null shader");
34 shader->declareFloat("specExp");
35 shader->declareFloat("specStrength");
36 shader->declareFloat("primaryShift");
37 shader->declareFloat("secondaryShift");
38 shader->declareFloat("alphaCutoff");
39 shader->declareFloat("rimStrength");
40 shader->declareVec3("strandDir");
41 shader->sendFloat("specExp", 80.f);
42 shader->sendFloat("specStrength", 0.85f);
43 shader->sendFloat("primaryShift", 0.08f);
44 shader->sendFloat("secondaryShift", -0.06f);
45 shader->sendFloat("alphaCutoff", 0.15f);
46 shader->sendFloat("rimStrength", 0.35f);
47 shader->sendVec3("strandDir", 0.f, 0.f, 0.f);
48}
49
51 if (!gfx) throw eve::Exception("hair::createShader: null graphics");
52 auto vert = copySpv(mesh3d_hair_vert_spv, mesh3d_hair_vert_spv_count);
53 auto frag = copySpv(mesh3d_hair_frag_spv, mesh3d_hair_frag_spv_count);
55 if (!sh || !sh->gpuHandle)
56 throw eve::Exception("hair::createShader: failed to create hair shader");
57 bindDefaults(sh);
58 return sh;
59}
60
61} // namespace eve::graphics::hair
vk::ShaderModule vert
vk::ShaderModule frag
Shader * shader
Light2D::Data * data
virtual Shader * newHairShaderFromSpv(const std::vector< uint32_t > &vertSpv, const std::vector< uint32_t > &fragSpv)=0
Hair/fur card shader (alpha blend + Kajiya-Kay). Empty vert → mesh3d_hair.vert. Owned by Graphics.
Custom GPU program.
Definition Shader.h:30
Built-in Kajiya-Kay hair/fur card shader helpers.
int paramCount()
Push-constant parameter names (same order as mesh3d_hair.frag).
std::string paramName(int index)
void bindDefaults(Shader *shader)
Bind default push-constant knobs on an existing hair shader.
Shader * createShader(Graphics *gfx)
Create the default hair shader (alpha-blended, anisotropic specular). Owned by Graphics.