FCT
载入中...
搜索中...
未找到
ShaderGenerator.h
浏览该文件的文档.
1//
2// Created by Administrator on 2025/4/11.
3//
4#ifndef FCT_SHADERGENERATOR_H
5#define FCT_SHADERGENERATOR_H
6#include "./ResourceLayout.h"
7#include "./ShaderGenerate.h"
9namespace FCT
10{
11 /*
12 *todo:
13 * 1.对于从外部加载S haderBinary,用spirv-cross,
14 * 对加载的Shader查找一下有没有对应的layout,
15 * 有用哪个的binding,没用就分配新的binding,
16 * 然后用spirv-cross反射改变shader里面的binding
17 * 2.对于外部加载的,通过判断name和布局是否一一 相等
18 * 来判断是否相等,如果布局 相等,但是名字不 相等
19 * 可以手动更改配置文件里面的名字来使得FCT判断其 相等
20 * 故对于ShaderBinary的存储,layout的名字应该需要好改,
21 * 应当只存储一次layout的名字
22 */
24 {
25 public:
26 ShaderGenerator() = default;
27 void ResourceLayoutToElements(ResourceLayout& resourceLayout,std::vector<TextureElement>& textureElements,std::vector<SamplerElement>& samplerElements);
28 std::string generateVertexShader(
29 const std::map<uint32_t, VertexLayout>& vertexLayouts,
30 const PixelLayout& pixelLayout,
31 const std::vector<ConstLayout>& uniformLayouts,
32 RHI::ShaderBinary& binary,
33 ResourceLayout& resourceLayout,
34 const std::string& userCode);
35
36 std::string generatePixelShader(
37 const PixelLayout& layout,
38 const std::vector<ConstLayout>& uniformLayouts,
39 RHI::ShaderBinary& binary,
40 ResourceLayout& resourceLayout,
41 const std::string& userCode);
42
43 std::string generateDefaultVertexMain(
44 const std::map<uint32_t, VertexLayout>& vertexLayouts,
45 const PixelLayout& pixelLayout);
46
47 std::string generateDefaultPixelMain(const PixelLayout& pixelLayout);
48
49 std::pair<uint32_t, uint32_t> getLayoutBinding(ConstLayout layout)
50 {
51 for (const auto& pair : m_layoutSetBindings) {
52 if (pair.first == layout) {
53 return pair.second;
54 }
55 }
56 //todo:alloc new binding
57 return std::make_pair(0, 0);
58 }
59 std::pair<uint32_t, uint32_t> getTextureBinding(TextureElement texture)
60 {
61 for (const auto& pair : m_textureSetBindings) {
62 if (pair.first == texture) {
63 return pair.second;
64 }
65 }
66 ferr << "getTextureBinding 返回过 (0,0)" << std::endl;
67 //todo:alloc new binding
68 return std::make_pair(0, 0);
69 }
70
71 std::pair<uint32_t, uint32_t> getSamplerBinding(SamplerElement sampler)
72 {
73 for (const auto& pair : m_samplerSetBindings) {
74 if (pair.first == sampler) {
75 return pair.second;
76 }
77 }
78 //todo:alloc new binding
79 return std::make_pair(0, 0);
80 }
82 {
83 for (const auto& pair : m_textureSetBindings) {
84 if (pair.first.getName() == name) {
85 return pair.first;
86 }
87 }
88 return TextureElement();
89 }
90 std::pair<uint32_t, uint32_t> allocateTextureBinding(const TextureElement& texture);
91 std::pair<uint32_t, uint32_t> allocateSamplerBinding(const SamplerElement& sampler);
92
93 protected:
94 std::string generateShaderIn(
95 const std::map<uint32_t, VertexLayout>& layouts,
96 std::map<std::string, uint32_t>& locationMap);
97
98 std::string generateShaderIn(const PixelLayout& layout);
99
100 std::string generateShaderOut(const PixelLayout& layout);
101
102 std::string generateShaderOut();
103
104 std::string generateFromPixelLayout(const PixelLayout& layout);
105
106 std::string generateVertexMain(
107 const std::map<uint32_t, VertexLayout>& vertexLayouts,
108 const PixelLayout& pixelLayout);
109
110 std::string generatePixelMain(const PixelLayout& pixelLayout);
111 std::string generateTexturesAndSamplers(RHI::ShaderBinary& binary, const std::vector<TextureElement>& textures,
112 const std::vector<SamplerElement>& samplers);
113
114 std::string uniformTypeToShaderType(ConstType type);
115
116 std::string generateConstBuffer(RHI::ShaderBinary& binary,const std::vector<ConstLayout>& uniforms);
117
118 std::vector<std::pair<ConstLayout, std::pair<uint32_t, uint32_t>>> m_layoutSetBindings;
119 std::unordered_map<UpdateFrequency, uint32_t> m_frequencyBindingCount;
120
121 std::vector<std::pair<TextureElement, std::pair<uint32_t, uint32_t>>> m_textureSetBindings;
122 std::vector<std::pair<SamplerElement, std::pair<uint32_t, uint32_t>>> m_samplerSetBindings;
123 };
124}
125#endif //FCT_SHADERGENERATOR_H
std::string generateTexturesAndSamplers(RHI::ShaderBinary &binary, const std::vector< TextureElement > &textures, const std::vector< SamplerElement > &samplers)
std::string generateVertexShader(const std::map< uint32_t, VertexLayout > &vertexLayouts, const PixelLayout &pixelLayout, const std::vector< ConstLayout > &uniformLayouts, RHI::ShaderBinary &binary, ResourceLayout &resourceLayout, const std::string &userCode)
std::pair< uint32_t, uint32_t > allocateTextureBinding(const TextureElement &texture)
std::string generateShaderIn(const std::map< uint32_t, VertexLayout > &layouts, std::map< std::string, uint32_t > &locationMap)
std::string uniformTypeToShaderType(ConstType type)
std::vector< std::pair< SamplerElement, std::pair< uint32_t, uint32_t > > > m_samplerSetBindings
void ResourceLayoutToElements(ResourceLayout &resourceLayout, std::vector< TextureElement > &textureElements, std::vector< SamplerElement > &samplerElements)
ShaderGenerator()=default
std::vector< std::pair< ConstLayout, std::pair< uint32_t, uint32_t > > > m_layoutSetBindings
std::pair< uint32_t, uint32_t > getLayoutBinding(ConstLayout layout)
std::string generateDefaultPixelMain(const PixelLayout &pixelLayout)
std::string generateDefaultVertexMain(const std::map< uint32_t, VertexLayout > &vertexLayouts, const PixelLayout &pixelLayout)
TextureElement findTextureElementByName(std::string name)
std::string generatePixelShader(const PixelLayout &layout, const std::vector< ConstLayout > &uniformLayouts, RHI::ShaderBinary &binary, ResourceLayout &resourceLayout, const std::string &userCode)
std::pair< uint32_t, uint32_t > allocateSamplerBinding(const SamplerElement &sampler)
std::string generateVertexMain(const std::map< uint32_t, VertexLayout > &vertexLayouts, const PixelLayout &pixelLayout)
std::string generateConstBuffer(RHI::ShaderBinary &binary, const std::vector< ConstLayout > &uniforms)
std::pair< uint32_t, uint32_t > getSamplerBinding(SamplerElement sampler)
std::string generatePixelMain(const PixelLayout &pixelLayout)
std::pair< uint32_t, uint32_t > getTextureBinding(TextureElement texture)
std::vector< std::pair< TextureElement, std::pair< uint32_t, uint32_t > > > m_textureSetBindings
std::string generateFromPixelLayout(const PixelLayout &layout)
std::unordered_map< UpdateFrequency, uint32_t > m_frequencyBindingCount
std::ostream & ferr