Шейдер из файла, программа перестала работать - PullRequest
2 голосов
/ 21 июня 2011

После учебника OpenGL ,

в части, где он создает вершинный шейдер, он использует следующий метод,

const GLchar* VertexShader =
{
    "#version 330\n"\

    "layout(location=0) in vec4 in_Position;\n"\
    "layout(location=1) in vec4 in_Color;\n"\
    "out vec4 ex_Color;\n"\

    "void main(void)\n"\
    "{\n"\
    "       gl_Position = in_Position;\n"\
    "       ex_Color = in_Color;\n"\
    "}\n"
};

Я просто заменяю этот код своим кодом, который выводит шейдер из файла,

string readShaderFile(string FileName)
{
string ShaderString = "";
ifstream shaderFile;
shaderFile.open(FileName);
    while(!shaderFile.eof())
    {
        string tempholder;
        getline(shaderFile, tempholder);      
        ShaderString.append(tempholder);
        ShaderString.append("\n");
    }
shaderFile.close();

return ShaderString;
}

const GLchar *VertexShader = readShaderFile("v.vert").c_str();

и BANG!

код больше не работает. В чем может быть проблема?

файл v.vert содержит следующий код:

#version 330

layout(location=0) in vec4 in_Position;
layout(location=1) in vec4 in_Color;
out vec4 ex_Color;

void main(void)
{
    gl_Position = in_Position;
    ex_Color = in_Color;
}

Ответы [ 2 ]

2 голосов
/ 21 июня 2011

Ваша функция загрузки шейдера должна выглядеть примерно так:

string readShaderFile(const string fileName)
{
  std::ifstream shaderFile( fileName.c_str() );

  // find the file size
  shaderFile.seekg(0,std::ios::end);
  std::streampos          length = shaderFile.tellg();
  shaderFile.seekg(0,std::ios::beg);

  // read whole file into a vector:
  std::vector<char>       buffer(length);
  shaderFile.read(&buffer[0],length);

  // return the shader string
  return std::string( buffer.begin(), buffer.end() );
}

Кроме того, что вы делаете после этой строки:

const GLchar *VertexShader = readShaderFile("v.vert").c_str();

?
Временная строкауничтожается, а VertexShader содержит висячий указатель.Что вам нужно сделать, это:

const std::string shaderProgram = readShaderFile("v.vert");
const GLchar *VertexShader = shaderProgram.c_str();
// create shader program
// etc
2 голосов
/ 21 июня 2011

Вам не нужно разбивать прочитанный файл на строки, просто передайте весь файл как есть.Кроме того, эти '\ n' есть в коде C, потому что вы не можете иметь обычные символы новой строки в строке C.Вы должны избежать их.Но это не обязательное чтение из файла.

И тогда у вас возникает проблема:

const GLchar *VertexShader = readShaderFile("v.vert").c_str();

readShaderFile возвращает std :: string, которая выходит изобласть действия и компилятор могут отменить привязку экземпляра строки прямо здесь.Вы должны хранить возвращаемую строку в ее собственной переменной и хранить ее до тех пор, пока вы хотите использовать ее c_str ();

Поскольку это предположительно в глобальной области видоизменения, измените ее следующим образом:*

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