add in/out varyings to materials in gldefs
This commit is contained in:
parent
0bbc0cd8b4
commit
fee7fed1d0
5 changed files with 92 additions and 8 deletions
|
|
@ -42,6 +42,13 @@ struct UniformFieldDesc
|
|||
std::size_t Offset;
|
||||
};
|
||||
|
||||
struct VaryingFieldDesc
|
||||
{
|
||||
FString Name;
|
||||
FString Property;
|
||||
UniformType Type;
|
||||
};
|
||||
|
||||
struct UniformField
|
||||
{
|
||||
UniformType Type = UniformType::Undefined;
|
||||
|
|
|
|||
|
|
@ -163,9 +163,9 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key)
|
|||
const FString& name = ExtractFileBase(desc.shader.GetChars());
|
||||
FString defines = defaultshaders[desc.shaderType].Defines + desc.defines;
|
||||
|
||||
program.vert = LoadVertShader(name, mainvp, desc.vertshader.IsEmpty() ? vert_nocustom : desc.vertshader.GetChars(), defines.GetChars(), key, &desc.Uniforms);
|
||||
program.vert = LoadVertShader(name, mainvp, desc.vertshader.IsEmpty() ? vert_nocustom : desc.vertshader.GetChars(), defines.GetChars(), key, &desc);
|
||||
if (!key.NoFragmentShader)
|
||||
program.frag = LoadFragShader(name, mainfp, desc.shader.GetChars(), defaultshaders[desc.shaderType].mateffect_lump, defaultshaders[desc.shaderType].lightmodel_lump_shared, defaultshaders[desc.shaderType].lightmodel_lump, defines.GetChars(), key, &desc.Uniforms);
|
||||
program.frag = LoadFragShader(name, mainfp, desc.shader.GetChars(), defaultshaders[desc.shaderType].mateffect_lump, defaultshaders[desc.shaderType].lightmodel_lump_shared, defaultshaders[desc.shaderType].lightmodel_lump, defines.GetChars(), key, &desc);
|
||||
|
||||
desc.Uniforms.WriteUniforms(program.Uniforms);
|
||||
}
|
||||
|
|
@ -201,7 +201,7 @@ static void addPushConstants(FString &layoutBlock, const UserUniforms *uniforms)
|
|||
|
||||
}
|
||||
|
||||
std::unique_ptr<VulkanShader> VkShaderManager::LoadVertShader(FString shadername, const char *vert_lump, const char *vert_lump_custom, const char *defines, const VkShaderKey& key, const UserUniforms *uniforms)
|
||||
std::unique_ptr<VulkanShader> VkShaderManager::LoadVertShader(FString shadername, const char *vert_lump, const char *vert_lump_custom, const char *defines, const VkShaderKey& key, const UserShaderDesc *shader)
|
||||
{
|
||||
FString definesBlock;
|
||||
definesBlock << defines;
|
||||
|
|
@ -222,10 +222,17 @@ std::unique_ptr<VulkanShader> VkShaderManager::LoadVertShader(FString shadername
|
|||
definesBlock << "#define USE_LEVELMESH\n";
|
||||
|
||||
FString layoutBlock;
|
||||
addPushConstants(layoutBlock, uniforms);
|
||||
addPushConstants(layoutBlock, shader ? &shader->Uniforms : nullptr);
|
||||
layoutBlock << LoadPrivateShaderLump("shaders/scene/layout_shared.glsl").GetChars() << "\n";
|
||||
layoutBlock << LoadPrivateShaderLump("shaders/scene/layout_vert.glsl").GetChars() << "\n";
|
||||
|
||||
int varyingLocation = 11;
|
||||
if(shader) for(auto &varying : shader->Varyings)
|
||||
{
|
||||
layoutBlock.AppendFormat("layout(location = %d) %s out %s %s;\n", varyingLocation, varying.Property.GetChars(), GetTypeStr(varying.Type), varying.Name.GetChars());
|
||||
varyingLocation++;
|
||||
}
|
||||
|
||||
|
||||
FString codeBlock;
|
||||
codeBlock << LoadPrivateShaderLump(vert_lump).GetChars() << "\n";
|
||||
|
|
@ -243,7 +250,7 @@ std::unique_ptr<VulkanShader> VkShaderManager::LoadVertShader(FString shadername
|
|||
.Create(shadername.GetChars(), fb->GetDevice());
|
||||
}
|
||||
|
||||
std::unique_ptr<VulkanShader> VkShaderManager::LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *light_lump_shared, const char *light_lump, const char *defines, const VkShaderKey& key, const UserUniforms *uniforms)
|
||||
std::unique_ptr<VulkanShader> VkShaderManager::LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *light_lump_shared, const char *light_lump, const char *defines, const VkShaderKey& key, const UserShaderDesc *shader)
|
||||
{
|
||||
FString definesBlock;
|
||||
if (fb->IsRayQueryEnabled()) definesBlock << "\n#define SUPPORTS_RAYQUERY\n";
|
||||
|
|
@ -331,10 +338,17 @@ std::unique_ptr<VulkanShader> VkShaderManager::LoadFragShader(FString shadername
|
|||
else definesBlock << "#define uFogEnabled 0\n";
|
||||
|
||||
FString layoutBlock;
|
||||
addPushConstants(layoutBlock, uniforms);
|
||||
addPushConstants(layoutBlock, shader ? &shader->Uniforms : nullptr);
|
||||
layoutBlock << LoadPrivateShaderLump("shaders/scene/layout_shared.glsl").GetChars() << "\n";
|
||||
layoutBlock << LoadPrivateShaderLump("shaders/scene/layout_frag.glsl").GetChars() << "\n";
|
||||
|
||||
int varyingLocation = 11;
|
||||
if(shader) for(auto &varying : shader->Varyings)
|
||||
{
|
||||
layoutBlock.AppendFormat("layout(location = %d) %s in %s %s;\n", varyingLocation, varying.Property.GetChars(), GetTypeStr(varying.Type), varying.Name.GetChars());
|
||||
varyingLocation++;
|
||||
}
|
||||
|
||||
|
||||
FString codeBlock;
|
||||
codeBlock << LoadPrivateShaderLump(frag_lump).GetChars() << "\n";
|
||||
|
|
|
|||
|
|
@ -150,8 +150,8 @@ public:
|
|||
VulkanShader* GetLightTilesShader() { return LightTiles.get(); }
|
||||
|
||||
private:
|
||||
std::unique_ptr<VulkanShader> LoadVertShader(FString shadername, const char *vert_lump, const char *vert_lump_custom, const char *defines, const VkShaderKey& key, const UserUniforms *uniforms);
|
||||
std::unique_ptr<VulkanShader> LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *light_lump_shared, const char *lightmodel_lump, const char *defines, const VkShaderKey& key, const UserUniforms *uniforms);
|
||||
std::unique_ptr<VulkanShader> LoadVertShader(FString shadername, const char *vert_lump, const char *vert_lump_custom, const char *defines, const VkShaderKey& key, const UserShaderDesc *shader);
|
||||
std::unique_ptr<VulkanShader> LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *light_lump_shared, const char *lightmodel_lump, const char *defines, const VkShaderKey& key, const UserShaderDesc *shader);
|
||||
|
||||
ShaderIncludeResult OnInclude(FString headerName, FString includerName, size_t depth, bool system);
|
||||
|
||||
|
|
|
|||
|
|
@ -114,6 +114,7 @@ struct UserShaderDesc
|
|||
bool disablealphatest = false;
|
||||
uint8_t shaderFlags = 0;
|
||||
|
||||
std::vector<VaryingFieldDesc> Varyings;
|
||||
UserUniforms Uniforms;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1634,6 +1634,68 @@ class GLDefsParser
|
|||
hasUniforms = true;
|
||||
ParseShaderUniform(Uniforms, usershaders.Size(), false, is_globalshader ? globaltargets.Size() : 1);
|
||||
}
|
||||
else if (sc.Compare("varying"))
|
||||
{
|
||||
isProperty = true;
|
||||
bool ok = true;
|
||||
|
||||
sc.MustGetString();
|
||||
FString varyingProperty = "";
|
||||
|
||||
if (sc.Compare("noperspective"))
|
||||
{
|
||||
varyingProperty = "noperspective";
|
||||
sc.MustGetString();
|
||||
}
|
||||
else if (sc.Compare("flat") == 0)
|
||||
{
|
||||
varyingProperty = "flat";
|
||||
sc.MustGetString();
|
||||
}
|
||||
else
|
||||
{
|
||||
varyingProperty = "";
|
||||
}
|
||||
|
||||
FString varyingType = sc.String;
|
||||
varyingType.ToLower();
|
||||
|
||||
sc.MustGetString();
|
||||
FString varyingName = sc.String;
|
||||
|
||||
UniformType parsedType = UniformType::Undefined;
|
||||
|
||||
if (varyingType.Compare("int") == 0)
|
||||
{
|
||||
parsedType = UniformType::Int;
|
||||
}
|
||||
else if (varyingType.Compare("float") == 0)
|
||||
{
|
||||
parsedType = UniformType::Float;
|
||||
}
|
||||
else if (varyingType.Compare("vec2") == 0)
|
||||
{
|
||||
parsedType = UniformType::Vec2;
|
||||
}
|
||||
else if (varyingType.Compare("vec3") == 0)
|
||||
{
|
||||
parsedType = UniformType::Vec3;
|
||||
}
|
||||
else if (varyingType.Compare("vec4") == 0)
|
||||
{
|
||||
parsedType = UniformType::Vec4;
|
||||
}
|
||||
else
|
||||
{
|
||||
sc.ScriptError("Unrecognized varying type '%s'", sc.String);
|
||||
ok = false;
|
||||
}
|
||||
|
||||
if(ok)
|
||||
{
|
||||
usershader.Varyings.push_back({varyingName, varyingProperty, parsedType});
|
||||
}
|
||||
}
|
||||
else if (sc.Compare("texture"))
|
||||
{
|
||||
isProperty = true;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue