57 lines
1.8 KiB
C++
57 lines
1.8 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:
|
|
ShaderService(const std::filesystem::path &vertexShaderPath, const std::filesystem::path &fragShaderPath);
|
|
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
|