zoukankan      html  css  js  c++  java
  • OpenGL 着色器管理类 Shader

    一个用于管理着色器的类

    #pragma once
    #ifndef SHADER_H
    #define SHADER_H
    
    #include <glad/glad.h>
    
    #include <string>
    #include <fstream>
    #include <sstream>
    #include <iostream>
    
    class Shader
    {
    public:
        unsigned int ID;
        Shader(const GLchar*vertexPath, const GLchar* fragmentPath){
            // 1. 从文件路径中获取顶点/片段着色器
            std::string vertexCode;
            std::string fragmentCode;
            std::ifstream vShaderFile;
            std::ifstream fShaderFile;
            // 保证ifstream对象可以抛出异常
            vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
            fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
            try {
                //打开文件
                vShaderFile.open(vertexPath);
                fShaderFile.open(fragmentPath);
                std::stringstream vShaderStream, fShaderStream;
                // 读取文件的缓冲内容到数据流中
                vShaderStream << vShaderFile.rdbuf();
                fShaderStream << fShaderFile.rdbuf();
                // 关闭文件处理器
                vShaderFile.close();
                fShaderFile.close();
                // 转换数据流到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();
    
            //编译着色器
            unsigned int vertex, fragment;
    
            //顶点着色器
            vertex = glCreateShader(GL_VERTEX_SHADER);
            glShaderSource(vertex, 1, &vShaderCode, NULL);
            glCompileShader(vertex);
            checkCompileErrors(vertex, "VERTEX");
    
            //片段着色器
            fragment = glCreateShader(GL_FRAGMENT_SHADER);
            glShaderSource(fragment, 1, &fShaderCode, NULL);
            glCompileShader(fragment);
            checkCompileErrors(fragment, "FRAGMENT");
    
            //着色器程序
            ID = glCreateProgram();
            glAttachShader(ID, vertex);
            glAttachShader(ID, fragment);
            glLinkProgram(ID);
            checkCompileErrors(ID, "PROGRAM");
    
            //// 删除着色器,它们已经链接到我们的程序中了,已经不再需要了
            glDeleteShader(vertex);
            glDeleteShader(fragment);
        }
        void use() {
            glUseProgram(ID);
        }
        //unifor工具函数
        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:
        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
  • 相关阅读:
    前端布局
    mysql默认数据库
    js 计算两个颜色之间的渐变色值 10个色值
    chrome network中的stalled阶段耗时含义
    linux软件源码安装与封装包安装
    如何分辨linux文件颜色
    linux 文件权限
    linux端口查看
    suse linux光盘挂载
    记一次tortoiese git误提交的问题
  • 原文地址:https://www.cnblogs.com/--zz/p/9704454.html
Copyright © 2011-2022 走看看