这个问题在这里已有答案:
好的,所以我开始使用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 *来测试这些着色器,并且它们工作正常 .
为了使这里更容易,还有一些额外的信息:
-
使用SDL 2.0
-
通过SDL2.0初始化OpenGL
-
使用GLEW加载扩展
-
通过此函数读取文本文件:
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);
}
1 回答
这是你的问题
在此之后
vertex_shader
指针再次变为 not ,只要容器没有改变(指定给它正在改变),c_str()
指针才有效 .使用2 std :: strings代替: