mp/include/shaderService.h

59 lines
1.9 KiB
C++

//
// Created by jie on 2023/10/11.
//
#ifndef LEARNOPENGL_SHADERHELPER_H
#define LEARNOPENGL_SHADERHELPER_H
#include "glad/glad.h"
#include <filesystem>
#include <type_traits>
#include <glm/glm.hpp>
class ShaderService
{
private:
unsigned int programId;
public:
explicit ShaderService(const char* vSource, const char* fSource);
explicit ShaderService(const std::filesystem::path &vertexShaderPath, const std::filesystem::path &fragShaderPath);
void InitShader(const char* vSource, const char* fSource);
bool CheckShader(unsigned int shaderIndex, bool isProgram = false);
void Use();
inline unsigned int GetId() { return this->programId; }
template <typename T>
requires std::is_same_v<T, bool> || std::is_same_v<T, int> || std::is_same_v<T, float> ||
std::is_same_v<T, glm::mat4> || std::is_same_v<T, glm::vec3>
void SetUniform(std::string_view name, T value);
};
template <typename T>
requires std::is_same_v<T, bool> || std::is_same_v<T, int> || std::is_same_v<T, float> ||
std::is_same_v<T, glm::mat4> || std::is_same_v<T, glm::vec3>
void ShaderService::SetUniform(std::string_view name, T value)
{
if constexpr (std::is_same_v<T, bool>)
{
glUniform1i(glGetUniformLocation(programId, name.data()), (int)value);
}
else if constexpr (std::is_same_v<T, int>)
{
glUniform1i(glGetUniformLocation(programId, name.data()), value);
}
else if constexpr (std::is_same_v<T, float>)
{
glUniform1f(glGetUniformLocation(programId, name.data()), value);
}
else if constexpr (std::is_same_v<T, glm::mat4>)
{
const auto index = glGetUniformLocation(this->programId, name.data());
glUniformMatrix4fv(index, 1, GL_FALSE, &value[0][0]);
}
else if constexpr (std::is_same_v<T, glm::vec3>){
glUniform3fv(glGetUniformLocation(programId, name.data()), 1, &value[0]);
}
}
#endif // LEARNOPENGL_SHADERHELPER_H