无法编译顶点着色器:令牌"<EOF>"出现意外$end
Cannot Compile Vertex Shader: Unexpected $end at token "<EOF>"
我在 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: %sn", 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>"
加载文件定义如下:
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 330n"
"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 切换到 &testvShader 时,程序运行良好。但是我不明白加载如何成为问题,因为片段着色器的加载方式相同,并且可以完美地编译和运行,并且在编译之前我将文件打印到控制台,看起来不错。我处于智慧的尽头,我不知道问题是什么。
附言我正在 Fedora 上运行,如果这很重要的话。
在temp
上调用c_str()
并将结果存储在变量中,然后修改temp
并使用保存的 c_str()
结果。这不起作用,因为如果您修改字符串,c_str() 的结果将变为无效。
此编译器错误通常是由尾随垃圾引起的。最简单的补救措施是告诉 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);
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- EASTL矢量<向量<int>>连续的
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- 而(!inputfile.eof())只读取第一行?
- EOF有更安全的替代方案吗?它在我的情况下不起作用
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 如何在 EOF 之前从文件中读取并将其放入字符串中?
- 如何在从文件中读取整数时使用 file.eof()?
- "eof"可以设置为流吗?
- 吃完 EOF 后重复使用 std::cin
- 文件处理,eof() 定义
- std::cin 在读取 EOF 并清除后不再读取
- 为什么 EOF 在循环扫描期间没有终止?
- cin.clear()是否保留EOF
- 而(getline(fin,str)){}即使在到达eof之后仍在处理数据
- 通过终端在文件中输入时检测EOF(文件结束)时出现问题
- 为什么如果我从键盘输入EOF克里昂不要在运行窗口打印程序的输出?
- 为什么"cin"在EOF之后不再wοrk?
- 在 <char>sizeof(int) == 1 的平台中如何编码 char_traits::eof() ?
- 读取 c++ istream 直到 EOF,同时丢弃内容