Невозможно скомпилировать вершинный шейдер: неожиданный конец $ на токене & lt; EOF & gt;

У меня есть некоторые проблемы с компиляцией моих вершинных шейдеров под OpenGL. У меня довольно стандартный вершинный шейдер:

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

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

string temp = LoadFile(vShaderPath);
const char* vShaderString = temp.c_str();
const char* vShaderPathC = vShaderPath.c_str();
fprintf(stderr, "File: %s \nContents: %s\n", vShaderPathC, vShaderString);
temp = LoadFile(fShaderPath);
const char* fShaderString = temp.c_str();

vShaderHandle = glCreateShader(GL_VERTEX_SHADER);
fShaderHandle = glCreateShader(GL_FRAGMENT_SHADER);

glShaderSource(vShaderHandle, 1, &vShaderString, NULL);
glShaderSource(fShaderHandle, 1, &fShaderString, NULL);

GLint compiled;

glCompileShader(vShaderHandle);
glCompileShader(fShaderHandle);

glGetShaderiv(vShaderHandle, GL_COMPILE_STATUS, &compiled);
if(compiled == false)
{
fprintf(stderr, "ERROR: Vertex shader not compiled properly.\n");

GLint blen = 0;
GLsizei slen = 0;

glGetShaderiv(vShaderHandle, GL_INFO_LOG_LENGTH , &blen);
if (blen > 1)
{
GLchar* compiler_log = new GLchar[blen];
glGetInfoLogARB(vShaderHandle, blen, &slen, compiler_log);
fprintf(stderr, "compiler log:\n %s", compiler_log);
delete [] compiler_log;
}
}

но когда я запускаю свою программу, я получаю вывод:

INFO: OpenGL Version: 3.3.0 NVIDIA 310.19
File: vShader.v.glsl
Contents: #version 330

layout(location=0) in vec4 in_Position;
layout(location=1) in vec4 in_Color;
void main(void)
{
gl_Position = in_Position;
ex_Color = in_Color;
}

ERROR: Vertex shader not compiled properly.
compiler log:
(0) : error C0000: syntax error, unexpected $end at token "<EOF>"

Loadfile определяется:

string ShaderEffect::LoadFile(string path)
{
ifstream in(path.c_str(), ios::in);

if(in.is_open())
{

string contents;
in.seekg(0, ios::end);
contents.resize(in.tellg());
in.seekg(0, ios::beg);
in.read(&contents[0], contents.size());
in.close();
return contents;
}
else
throw "Problem reading file!";
}

Я знаю, что сам код glsl не является проблемой, потому что я жестко закодировал строку в:

const char * testvShader = {
"#version 330\n"\
"layout(location=0) in vec4 in_Position;\n"\
"layout(location=1) in vec4 in_Color;\n"\
"out vec4 ex_Color;""void main()\n"\
"{\n"\
"    gl_Position = in_Position;\n"\
"    ex_Color = in_Color;\n"\
"}"};

и когда я переключаюсь &vShaderString to &testvShader программа работает нормально. Но я не понимаю, как может быть проблема с загрузкой, потому что фрагментный шейдер загружается одинаково, компилируется и работает отлично, и я печатаю файл на консоль перед компиляцией, и он выглядит нормально. Я в своем уме, я не могу понять, в чем проблема.

Постскриптум Я работаю на Fedora, если это имеет значение.

3

Решение

Ты звонишь c_str() на temp и сохранить результат в переменной, а затем изменить temp и использовать сохраненный результат c_str(), Это не работает, потому что результат c_str () становится недействительным, если вы измените строку.

3

Другие решения

Эта ошибка компилятора обычно вызывается завершающим мусором. Самое простое средство — сообщить OpenGL, какой длины имеет исходная строка.

Замените ваши вызовы glShaderSource на

const char* vShaderString = temp.c_str();
int vertex_shader_string_length = temp.length();

/* ... */

const char* fShaderString = temp.c_str();
int fragment_shader_string_length = temp.length();

glShaderSource(vShaderHandle, 1, &vShaderString, &vertex_shader_string_length);
glShaderSource(fShaderHandle, 1, &fShaderString, &fragment_shader_string_length);
1

По вопросам рекламы [email protected]