zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    在IE地址栏输入JS的有趣效果
    min-height for IE6
    针对主流浏览器的CSS-HACK写法及IE常用条件注释
    spring mvc从前台往后台传递参数的三种方式
    SQL语句优化
    SpringCloud分布式开发理解
    Spring的三大核心思想
    单例模式中的懒汉模式及饿汉模式
    SpringMVC工作原理
    堆和栈的区别及堆区和栈区的区别
  • 原文地址:https://www.cnblogs.com/DOGame/p/13823740.html
Copyright © 2011-2022 走看看