为什么glsl的“ #version”定义给我一个错误?

问题描述

我有一个简单的着色器创建管道。没什么特别的。我可以告诉我的信息,着色器源可以正确读取。最初,我在后缀为'.glsl'的文件中使用了着色器代码,只是因为我想这样做,但现在它们是普通的'.txt'文件。

阅读着色器代码后,我将编译着色器并链接着色器,并检查编译状态和信息日志中是否存在错误。下面的实际着色器代码在我看来并不像它有一个错误,因为考虑到它现在基本上已经不是可以在网上找到的简单教程的精装本,可以在需要时链接到我。

我确实得到了一个错误,它是“ 0(1):错误C0104:未知的预处理程序指令#version330”。 顶点着色器和片段着色器的创建过程几乎相同。

我的驱动程序版本也是[4.6.0 NVIDIA 445.87],因此我应该能够使用#version 330。 我也确实将它们都设置为“ #version 330 core”,但是我遇到了同样的错误。

这是我的程序和着色器创建过程。


   struct s_Program
   {
       uint32_t program,vert,frag;

       s_Program()
       {
           vert = glCreateShader(GL_VERTEX_SHADER);
           frag = glCreateShader(GL_FRAGMENT_SHADER);
           program = glCreateProgram();
       }

       bool genVert(const char* fpath)
       {
           std::fstream file(fpath);
           if (!file)
           {
               logf("[FILE_ERROR] : Failed to read shader file.");
               return(false);
           }

           logf("Reading vert shader.");
           const char* source;
           std::string newSource,line;
           while (file >> line)
           {
               newSource += line;
           }
           source = newSource.c_str();

           glShaderSource(vert,1,&source,0);
           glCompileShader(vert);

           int comp;
           glGetShaderiv(vert,GL_COMPILE_STATUS,&comp);
           if (comp == GL_FALSE)
           {
               int maxLength = 0;
               glGetShaderiv(vert,GL_INFO_LOG_LENGTH,&maxLength);

               std::vector<char> errorLog(maxLength);
               glGetShaderInfoLog(vert,maxLength,&maxLength,&errorLog[0]);

               logf(&errorLog[0]);

               glDeleteShader(vert);
               return(false);
           }

           glAttachShader(program,vert);
           return(true);
       }

       bool genFrag(const char* fpath)
       {
           std::fstream file(fpath);
           if (!file)
           {
               logf("[FILE_ERROR] : Failed to read shader file.");
               return(false);
           }

           const char* source;
           std::string newSource = "",line;
           while (file >> line)
           {
               newSource += line;
           }
           source = newSource.c_str();

           glShaderSource(frag,0);
           glCompileShader(frag);

           int comp;
           glGetShaderiv(frag,&comp);
           if (comp == GL_FALSE)
           {
               int maxLength = 0;
               glGetShaderiv(frag,&maxLength);

               std::vector<char> errorLog(maxLength);
               glGetShaderInfoLog(frag,&errorLog[0]);

               logf(&errorLog[0]);

               glDeleteShader(frag);
               return(false);
           }

           glAttachShader(program,frag);
           return(true);
       }

       void linkProgram()
       {
           glLinkProgram(program); glDetachShader(program,vert); glDetachShader(program,frag);
           glDeleteShader(vert); glDeleteShader(frag);
       }

       void bindProgram()
       { glUseProgram(program); }

       void unbindProgram()
       { glUseProgram(0); }
   };

这些是我的着色器。


// Vertex
#version 330

in vec4 _pos;

out vec4 aColor;

void main()
{
    _pos = vec4(_pos,1.0);
    gl_Position = _pos;
}

// Fragment
#version 330

out vec4 FragColor;

in vec4 _color;

void main()
{
    _color = vec4(0.5,0.5,0.1,1.0);
    FragColor = _color;
}

这是主文件中的实现。


    s_Program mainShader;
    if (!mainShader.genVert("data/shaders/standardVert.txt"))
    { logf("[ERR] : Failed to generate Vertex Shader."); }
    if (mainShader.genFrag("data/shaders/standardFrag.txt"))
    { logf("[ERR] : Failed to generate Fragment Shader."); }
    mainShader.linkProgram();

然后我在我的循环中将我的函数“ bindProgram”设置为GL以使用该程序。

我显然缺少了一些东西,我只是想知道什么。

解决方法

您的while (file >> line)循环逐字读取。将每个单词附加到字符串可以有效地将着色器中的所有空格删除。

相反,执行此操作将文件原样读入std::string

std::stringstream src_ss;
file >> src_ss.rdbuf();
std::string newSource{ src_ss.str() };

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...