载入中...
搜索中...
未找到
Shader.h
浏览该文件的文档.
1#pragma once
2
3#include <array>
4#include <cstddef>
5#include <cstdint>
6#include <map>
7#include <string>
8#include <vector>
9
10#include <glm/mat4x4.hpp>
11
12namespace eve::graphics {
13
30class Shader {
31public:
32 static constexpr int kMaxFloats = 32;
33 static constexpr uint32_t kPushConstantBytes = uint32_t(kMaxFloats * sizeof(float));
34
35 enum class Kind { eSprite2D, eMesh3D };
36
45
48
49 Shader(const Shader &) = delete;
50 Shader &operator=(const Shader &) = delete;
51
52 Kind getKind() const { return kind_; }
53 void setKind(Kind k) { kind_ = k; }
54
61 void setXray(bool x) { isXray_ = x; }
62 bool isXray() const { return isXray_; }
63
65 int declareFloat(const std::string &name);
66 int declareVec2(const std::string &name);
67 int declareVec3(const std::string &name);
68 int declareVec4(const std::string &name);
69 int declareMatrix(const std::string &name);
70
71 void sendFloat(const std::string &name, float x);
72 void sendVec2(const std::string &name, float x, float y);
73 void sendVec3(const std::string &name, float x, float y, float z);
74 void sendVec4(const std::string &name, float x, float y, float z, float w);
75 void sendMatrix(const std::string &name, const glm::mat4 &m);
76
78 int sendToVar(const std::string &name, const void *data, size_t size);
79 int getFromVar(const std::string &name, void *data, size_t size) const;
80
81 bool hasUniform(const std::string &name) const;
82 int getUniformIndex(const std::string &name) const;
83 int getUniformFloatCount(const std::string &name) const;
84
85 const float *pushConstantData() const { return floats_.data(); }
86 uint32_t pushConstantSize() const { return uint32_t(usedFloats_ * sizeof(float)); }
87 int usedFloats() const { return usedFloats_; }
88
89 const std::vector<uint32_t> &vertexSpirv() const { return vertSpv_; }
90 const std::vector<uint32_t> &fragmentSpirv() const { return fragSpv_; }
91
92 void setSpirv(std::vector<uint32_t> vert, std::vector<uint32_t> frag) {
93 vertSpv_ = std::move(vert);
94 fragSpv_ = std::move(frag);
95 }
96
98 void *gpuHandle = nullptr;
99
100private:
101 struct Uniform {
102 int index = 0;
103 int floatCount = 0;
104 };
105
106 int declareUniform(const std::string &name, int floatCount);
107 Uniform *findUniform(const std::string &name);
108 const Uniform *findUniform(const std::string &name) const;
109
110 Kind kind_ = Kind::eSprite2D;
111 bool isXray_ = false;
112 std::vector<uint32_t> vertSpv_;
113 std::vector<uint32_t> fragSpv_;
114 std::map<std::string, Uniform> uniforms_;
115 std::array<float, kMaxFloats> floats_{};
116 int usedFloats_ = 0;
117};
118
119} // namespace eve::graphics
vk::ShaderModule vert
vk::ShaderModule frag
int y
Definition Grass.cpp:135
int z
Definition Grass.cpp:135
int x
Definition Grass.cpp:135
int w
const char * name
Definition RockMesh.cpp:21
float m[16]
Custom GPU program.
Definition Shader.h:30
void setSpirv(std::vector< uint32_t > vert, std::vector< uint32_t > frag)
Definition Shader.h:92
bool hasUniform(const std::string &name) const
Definition Shader.cpp:46
Shader & operator=(const Shader &)=delete
Kind getKind() const
Definition Shader.h:52
int usedFloats() const
Definition Shader.h:87
void sendVec2(const std::string &name, float x, float y)
Definition Shader.cpp:84
const std::vector< uint32_t > & fragmentSpirv() const
Definition Shader.h:90
int declareVec2(const std::string &name)
Definition Shader.cpp:31
void sendFloat(const std::string &name, float x)
Definition Shader.cpp:82
void sendMatrix(const std::string &name, const glm::mat4 &m)
Definition Shader.cpp:99
int getFromVar(const std::string &name, void *data, size_t size) const
Definition Shader.cpp:71
void sendVec3(const std::string &name, float x, float y, float z)
Definition Shader.cpp:89
void setXray(bool x)
X-ray mesh shader. When true, drawMeshShader renders this mesh a second pass over the already-lit sce...
Definition Shader.h:61
int declareMatrix(const std::string &name)
Definition Shader.cpp:34
int getUniformIndex(const std::string &name) const
Definition Shader.cpp:48
int getUniformFloatCount(const std::string &name) const
Definition Shader.cpp:54
bool isXray() const
Definition Shader.h:62
int declareVec3(const std::string &name)
Definition Shader.cpp:32
Shader(const Shader &)=delete
const std::vector< uint32_t > & vertexSpirv() const
Definition Shader.h:89
int declareVec4(const std::string &name)
Definition Shader.cpp:33
static constexpr int kMaxFloats
Definition Shader.h:32
static constexpr uint32_t kPushConstantBytes
Definition Shader.h:33
void setKind(Kind k)
Definition Shader.h:53
int declareFloat(const std::string &name)
Reserve sequential float slots in the push-constant block. Returns start index.
Definition Shader.cpp:30
void sendVec4(const std::string &name, float x, float y, float z, float w)
Definition Shader.cpp:94
int sendToVar(const std::string &name, const void *data, size_t size)
Low-level blob write into a declared uniform (size must match declaration).
Definition Shader.cpp:60
uint32_t pushConstantSize() const
Definition Shader.h:86
const float * pushConstantData() const
Definition Shader.h:85
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition AnimTrail.h:6