读取GLSL文件时获取垃圾字符

时间:2011-09-08 07:35:19

标签: c++ opengl

我遇到了以下问题。我从文件加载着色器。着色器程序在尝试编译时会抛出顶点和片段着色器的这些错误:

顶点信息

0(12):错误C0000:语法错误,令牌“”

意外$ undefined

片段信息

0(10):错误C0000:语法错误,令牌“”

意外$ undefined

当检查文件的加载内容时,我可以看到在着色器文件的开头和末尾附加了各种垃圾文本。就像这样:

#version 330

layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;

smooth out vec4 theColor;

void main()
{
gl_Position = position;
theColor = color;
}ýýýý««««««««þîþîþîþ

加载着色器的方法如下所示:

void ShaderLoader::loadShaders(char * vertexShaderFile,char *fragmentShaderFile){


vs = loadFile(vertexShaderFile,vlen);
    fs = loadFile(fragmentShaderFile,flen);

}
char *ShaderLoader::loadFile(char *fname,GLint &fSize){
ifstream::pos_type size;
char * memblock;
string text;

// file read based on example in cplusplus.com tutorial
ifstream file (fname, ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
fSize = (GLuint) size;
memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
cout << "file " << fname << " loaded" << endl;
text.assign(memblock);
}
else
{
cout << "Unable to open file " << fname << endl;
exit(1);
}
return memblock;
}

我试图从UTF-8顶级ANSI更改编码,也尝试在visual studio外编辑,但问题仍然存在。对此的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:8)

你正在使用C ++,所以我建议你利用它。我建议您读入std :: string:

,而不是读入自我分配的char数组
#include <string>
#include <fstream>

std::string loadFileToString(char const * const fname)
{
    std::ifstream ifile(fname);
    std::string filetext;

    while( ifile.good() ) {
        std::string line;
        std::getline(ifile, line);
        filetext.append(line + "\n");
    }

    return filetext;
}

自动处理所有内存分配和正确分隔 - 关键字是RAII:资源分配是初始化。稍后您可以使用类似

的内容上传着色器源
void glcppShaderSource(GLuint shader, std::string const &shader_string)
{
    GLchar const *shader_source = shader_string.c_str();
    GLint const shader_length = shader_string.size();

    glShaderSource(shader, 1, &shader_source, &shader_length);
}

void load_shader(GLuint shaderobject, char * const shadersourcefilename)
{
    glcppShaderSource(shaderobject, loadFileToString(shadersourcefilename));
}

答案 1 :(得分:2)

看起来你要做的就是再分配一个内存字节,你可以在其中放置一个空值('\ 0'):

...
memblock = new char[1 + fSize]; 
file.seekg (0, ios::beg);  
file.read (memblock, size);  
file.close();  
memblock[size] = '\0';
...

修改

我将代码更改为使用fSize而不是size,因为它是一个GLint,它只是一个整数的typedef。另外,我在我的机器上尝试了这个修复程序,它可以告诉我 - 在开始时没有垃圾,最后没有垃圾。