c ++ opengl我如何制作着色器文件并在主cpp中使用它[关闭]

Posted

技术标签:

【中文标题】c ++ opengl我如何制作着色器文件并在主cpp中使用它[关闭]【英文标题】:c++ opengl how can i make a shader file and use it in main cpp [closed] 【发布时间】:2019-09-01 06:27:54 【问题描述】:

我想让opengl读取着色器文件并在主cpp中使用它

我在 thechernoproject 频道尝试了教程,但有一个问题

struct ShaderProgramSource

    std::string VertexSource;
    std::string FragmentSource;
;
static ShaderProgramSource ParseShader(const std::string& filepath) 
    std::fstream stream(filepath);

    enum class ShaderType 
        NONE = -1, VERTEX = 0, FRAGMENT = 1
    ;

    std::string line;
    std::stringstream ss[2];
    ShaderType type = ShaderType::NONE;
    while (getline(stream, line))
    
        if (line.find("#shader") != std::string::npos) 
            if (line.find("vertex") != std::string::npos) 
                ShaderType type = ShaderType::VERTEX;
            
            else if (line.find("fragment") != std::string::npos) 
                ShaderType type = ShaderType::FRAGMENT;
            
        
        else
        
            ss[int(type)] << line << '\n';
        
    
    return ss[0].str(), ss[1].str() ;

我预计它会工作,但它没有显示它已获取文件

【问题讨论】:

【参考方案1】:

您在问题中提供的代码似乎读取了文件的一些额外信息,这不是OpenGL Shading Language 的一部分:

类似

#shader vertex

如果您想读取char 编码的文本文件(如 glsl 文件),那么我建议使用std::istreambuf_iterator

std::ifstream sourceFile(filepath, std::fstream::in);
std::string sourceCode;
if (sourceFile.is_open())
    sourceCode = std::string(std::istreambuf_iterator<char>(sourceFile), 
                             std::istreambuf_iterator<char>());

【讨论】:

以上是关于c ++ opengl我如何制作着色器文件并在主cpp中使用它[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅如何抽取着色器代码到assets目录下的GLSL文件,以及如何通过Java或者C++代码来加载着GLSL文件?

OpenGLES3.0创建着色器步骤

C ++ / OpenGL glm无法将矩阵插入着色器中的统一

OpenGL/C++:将多个纹理传递给一个着色器的问题

✠OpenGL-2-图像管线

OpenGL在可分离着色器程序中改变不同的位置