• shader 着色器类


    #ifndef SHADER_H
    #define SHADER_H

    #include <glad/glad.h>; // 包含glad来获取所有的必须OpenGL头文件

    #include <string>
    #include <fstream>
    #include <sstream>
    #include <iostream>


    class Shader
    {
    public:
    // 程序ID
    unsigned int ID;

    // 构造器读取并构建着色器
    Shader(const GLchar* vertexPath, const GLchar* fragmentPath);
    // 使用/激活程序
    void use();
    // uniform工具函数
    void setBool(const std::string &name, bool value) const;
    void setInt(const std::string &name, int value) const;
    void setFloat(const std::string &name, float value) const;

    Shader(const char* vertexPath, const char* fragmentPath)
    {
    // 1. retrieve the vertex/fragment source code from filePath
    std::string vertexCode;
    std::string fragmentCode;
    std::ifstream vShaderFile;
    std::ifstream fShaderFile;
    // ensure ifstream objects can throw exceptions:
    vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
    fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
    try
    {
    // open files
    vShaderFile.open(vertexPath);
    fShaderFile.open(fragmentPath);
    std::stringstream vShaderStream, fShaderStream;
    // read file's buffer contents into streams
    vShaderStream << vShaderFile.rdbuf();
    fShaderStream << fShaderFile.rdbuf();
    // close file handlers
    vShaderFile.close();
    fShaderFile.close();
    // convert stream into string
    vertexCode = vShaderStream.str();
    fragmentCode = fShaderStream.str();
    }
    catch (std::ifstream::failure& e)
    {
    std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
    }
    const char* vShaderCode = vertexCode.c_str();
    const char * fShaderCode = fragmentCode.c_str();
    // 2. compile shaders
    unsigned int vertex, fragment;
    // vertex shader
    vertex = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex, 1, &vShaderCode, NULL);
    glCompileShader(vertex);
    checkCompileErrors(vertex, "VERTEX");
    // fragment Shader
    fragment = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragment, 1, &fShaderCode, NULL);
    glCompileShader(fragment);
    checkCompileErrors(fragment, "FRAGMENT");
    // shader Program
    ID = glCreateProgram();
    glAttachShader(ID, vertex);
    glAttachShader(ID, fragment);
    glLinkProgram(ID);
    checkCompileErrors(ID, "PROGRAM");
    // delete the shaders as they're linked into our program now and no longer necessary
    glDeleteShader(vertex);
    glDeleteShader(fragment);
    }
    // activate the shader
    // ------------------------------------------------------------------------
    void use()
    {
    glUseProgram(ID);
    }
    // utility uniform functions
    // ------------------------------------------------------------------------
    void setBool(const std::string &name, bool value) const
    {
    glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value);
    }
    // ------------------------------------------------------------------------
    void setInt(const std::string &name, int value) const
    {
    glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
    }
    // ------------------------------------------------------------------------
    void setFloat(const std::string &name, float value) const
    {
    glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
    }

    private:
    // utility function for checking shader compilation/linking errors.
    // ------------------------------------------------------------------------
    void checkCompileErrors(unsigned int shader, std::string type)
    {
    int success;
    char infoLog[1024];
    if (type != "PROGRAM")
    {
    glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
    glGetShaderInfoLog(shader, 1024, NULL, infoLog);
    std::cout << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << " " << infoLog << " -- --------------------------------------------------- -- " << std::endl;
    }
    }
    else
    {
    glGetProgramiv(shader, GL_LINK_STATUS, &success);
    if (!success)
    {
    glGetProgramInfoLog(shader, 1024, NULL, infoLog);
    std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << " " << infoLog << " -- --------------------------------------------------- -- " << std::endl;
    }
    }
    }
    };

    #endif

  • 相关阅读:
    C#基于Socket的简单聊天室实践
    进程及进程间通信
    一次千万级别的SQL查询简单优化体验
    Attribute和Property
    解析Resources.arsc
    数据挖掘十大算法之决策树详解(2)
    数据挖掘十大算法之决策树详解(1)
    线性回归浅谈(Linear Regression)
    贝叶斯推断及其互联网应用(三):拼写检查
    贝叶斯推断及其互联网应用(二):过滤垃圾邮件
  • 原文地址:https://www.cnblogs.com/DOGame/p/13823740.html
Copyright © 2020-2023  润新知