43 lines
1.5 KiB
C++
43 lines
1.5 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>
|
|
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>
|
|
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]);
|
|
}
|
|
}
|
|
|
|
|
|
#endif //LEARNOPENGL_SHADERHELPER_H
|