59 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			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
 |