Получение мусорных символов при чтении файлов GLSL - PullRequest
2 голосов
/ 08 сентября 2011

Я сталкиваюсь со следующей проблемой. Я загружаю свои шейдеры из файлов. Программа шейдеров при попытке компиляции выдает эти ошибки для вершинных и фрагментных шейдеров:

Информация о вершинах

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;
}

Я пытался изменить кодировку с верхнего ANSI UTF-8, также пытался редактировать вне Visual Studio, но проблема все еще сохраняется. Любая помощь по этому вопросу будет оченьоценили.

Ответы [ 2 ]

8 голосов
/ 08 сентября 2011

Вы используете C ++, поэтому я предлагаю вам использовать это.Вместо чтения в самораспределенный массив символов, я предлагаю вам прочитать в std :: string:

#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));
}
2 голосов
/ 08 сентября 2011

Похоже, все, что вам нужно сделать, это выделить еще один байт памяти, в который вы можете поместить ноль ('\ 0'):

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

edit

Я изменилМой код для использования fSize в массиве, а не size, так как это GLint, который является просто typedef над целым числом.Кроме того, я попробовал это исправление на своей машине, и оно работает, насколько я могу судить - без мусора в начале и ни одного в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...