6#include "graphics/shaders/mesh3d_hair_frag_spv.inc"
7#include "graphics/shaders/mesh3d_hair_vert_spv.inc"
15const std::array<const char *, 9> kParams = {
"specExp",
"specStrength",
"primaryShift",
16 "secondaryShift",
"alphaCutoff",
"rimStrength",
17 "strandDirX",
"strandDirY",
"strandDirZ"};
19std::vector<uint32_t> copySpv(
const uint32_t *
data,
size_t count) {
20 return std::vector<uint32_t>(
data,
data + count);
28 if (index < 0 || index >=
int(kParams.size()))
return {};
29 return kParams[size_t(index)];
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);
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);
56 throw eve::Exception(
"hair::createShader: failed to create hair shader");
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.
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.