好的,所以我开始使用openGL 4和着色器进行冒险。在编译vertext着色器时,我发现了奇怪的语法错误。
即使我采用简单的顶点着色器:
#version 400
in vec3 vector_position;
void main()
{
gl_Position = vec4(vector_position, 1.0);
}
我确实收到了这个错误:
顶点着色器无法编译,但出现以下错误: 错误:0:1:错误(#132)语法错误:'<'解析错误 错误:错误(#273)1编译错误。没有生成代码
有什么奇怪之处,我的片段着色器正在编译而没有错误:
#version 400
out vec4 color;
void main()
{
color = vec4(1.0, 0.0, 0.0, 1.0);
}
并提供此消息:
compiler_log: 片段着色器已成功编译为在硬件上运行。
我尝试通过在代码中将它们作为const char *来测试这些着色器,并且它们工作正常。
为了使这里更容易,还有一些额外的信息:
通过此功能读取文本文件:
std::ifstream file(path);
if(!file.good())
{
OutputDebugStringA("File not found");
return nullptr;
}
std::stringstream stream ;
stream << file.rdbuf();
file.close();
return stream.str();
编辑:
在包含着色器的字符串末尾添加'\ 0'给了我其他错误:
compiler_log:
Vertex shader failed to compile with the following errors:
ERROR: 0:1: error(#132) Syntax error: '1.0' parse error
ERROR: error(#273) 1 compilation errors. No code generated
EDIT2:
有人想告诉他我如何处理整个字符串:
ShaderClass ShaderLoaderClass::createStaticShader(const std::string& file)
{
ResourceManager manager;
std::string container = "Just simple container";
container = manager.loadTextFile(file + ".vs");
container.push_back('\0');
//OutputDebugStringA(container.c_str());
const char* vertex_shader = container.c_str();
GLint lenVS = container.length();
container = manager.loadTextFile(file + ".fs");
container.push_back('\0');
//OutputDebugStringA(container.c_str());
const char* fragment_shader = container.c_str();
GLint lenFS = container.length();
unsigned int vs = glCreateShader (GL_VERTEX_SHADER);
unsigned int fs = glCreateShader (GL_FRAGMENT_SHADER);
glShaderSource (vs, 1, &vertex_shader, &lenVS);
glCompileShader (vs);
glShaderSource (fs, 1, &fragment_shader, &lenFS);
glCompileShader (fs);
checkErrors(vs);
checkErrors(fs);
unsigned int shader_programme = glCreateProgram();
glAttachShader (shader_programme, fs);
glAttachShader (shader_programme, vs);
glLinkProgram (shader_programme);
return ShaderClass(shader_programme);
}
答案 0 :(得分:3)
这是你的问题
const char* vertex_shader = container.c_str();
GLint lenVS = container.length();
container = manager.loadTextFile(file + ".fs");
此后vertex_shader
指针不再有效,只要容器没有更改,c_str()
指针才有效 (分配给它正在改变)
使用2 std :: strings代替:
std::string vertex_container = manager.loadTextFile(file + ".vs");
//OutputDebugStringA(vertex_container.c_str());
const char* vertex_shader = vertex_container.c_str();
GLint lenVS = vertex_container.length();
std::string fragment_container = manager.loadTextFile(file + ".fs");
//OutputDebugStringA(fragment_container.c_str());
const char* fragment_shader = fragment_container.c_str();
GLint lenFS = fragment_container.length();