我已经看到了大量类似的问题,但无论我尝试什么,我都无法让OpenGL加载我的着色器源。我的第一个想法是,指针数据可能 超出范围,这是对的。所以我将字符串保存在一个变量中,但OpenGL仍然给我一个错误。
/**
* Load shaders
*/
void GraphicsCore::loadShaders() {
// Create the main program
GLuint prog = glCreateProgram();
// Vertex shader
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
std::string vsSource = Utilities::fileToString("main.vert");
const GLchar* v = vsSource.c_str();
glShaderSource(vs,1,&v,nullptr);
std::cout << v;
glCompileShader(vs);
glAttachShader(prog,vs);
// Fragment shader
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
std::string fsSource = Utilities::fileToString("main.frag");
const GLchar* f = fsSource.c_str();
glShaderSource(fs,1,&f,nullptr);
std::cout << f;
glCompileShader(fs);
glAttachShader(prog,fs);
// Link program and use
glLinkProgram(prog);
glUseProgram(prog);
}
Utilities :: fileToString(“main.vert”)返回普通字符串,没有指针,没有引用。 cout调用两者都应该打印着色器源, 但是当我在BuGLe中运行应用程序时,调试器已经打破了 顶点着色器编译,包含以下消息:
0:1(1): error: syntax error, unexpected $end
似乎OpenGL根本找不到数据,但以防万一,顶点着色器代码:
#version 120
void main() { gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; }
更新
事情变得更加陌生。我尝试在内联编写阴影,并确保在文件和内联代码中使用完全相同的代码。令人惊讶的是,内联代码有效:
std::string vsSource = "#version 120\nvoid main() { gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; }";
std::string vsSource2 = Utilities::fileToString("main.vert");
在上面的代码中,vsSource编译时没有任何错误,而vsSource2给出了初始错误,如上所述。即使我用vsSource = vsSource2复制字符串,OpenGL仍然不会编译着色器。我检查了GDB中的着色器内容;文件中的字符串以及内联字符串具有相同的内容,字节为byte。以下代码是用于加载着色器的方法:
std::string Utilities::fileToString(const char* filename) {
std::ifstream f(filename,std::ios::binary);
if(f) {
std::string contents;
f.seekg(0,std::ios::end);
contents.resize(f.tellg());
f.seekg(0,std::ios::beg);
f.read(&contents[0], contents.size());
f.close();
return contents;
}
return "";
}
更新字符串内存转储
两个字符串都是96个字符长(没有\ 0)
(gdb) x/96c &vsSource[0]
0x2169ae8: 35 '#' 118 'v' 101 'e' 114 'r' 115 's' 105 'i' 111 'o' 110 'n'
0x2169af0: 32 ' ' 49 '1' 50 '2' 48 '0' 10 '\n' 118 'v' 111 'o' 105 'i'
0x2169af8: 100 'd' 32 ' ' 109 'm' 97 'a' 105 'i' 110 'n' 40 '(' 41 ')'
0x2169b00: 32 ' ' 123 '{' 32 ' ' 103 'g' 108 'l' 95 '_' 80 'P' 111 'o'
0x2169b08: 115 's' 105 'i' 116 't' 105 'i' 111 'o' 110 'n' 32 ' ' 61 '='
0x2169b10: 32 ' ' 103 'g' 108 'l' 95 '_' 80 'P' 114 'r' 111 'o' 106 'j'
0x2169b18: 101 'e' 99 'c' 116 't' 105 'i' 111 'o' 110 'n' 77 'M' 97 'a'
0x2169b20: 116 't' 114 'r' 105 'i' 120 'x' 32 ' ' 42 '*' 32 ' ' 103 'g'
0x2169b28: 108 'l' 95 '_' 77 'M' 111 'o' 100 'd' 101 'e' 108 'l' 86 'V'
0x2169b30: 105 'i' 101 'e' 119 'w' 77 'M' 97 'a' 116 't' 114 'r' 105 'i'
0x2169b38: 120 'x' 32 ' ' 42 '*' 32 ' ' 103 'g' 108 'l' 95 '_' 86 'V'
0x2169b40: 101 'e' 114 'r' 116 't' 101 'e' 120 'x' 59 ';' 32 ' ' 125 '}'
(gdb) x/96c &vsSource2[0]
0xbc4d28: 35 '#' 118 'v' 101 'e' 114 'r' 115 's' 105 'i' 111 'o' 110 'n'
0xbc4d30: 32 ' ' 49 '1' 50 '2' 48 '0' 10 '\n' 118 'v' 111 'o' 105 'i'
0xbc4d38: 100 'd' 32 ' ' 109 'm' 97 'a' 105 'i' 110 'n' 40 '(' 41 ')'
0xbc4d40: 32 ' ' 123 '{' 32 ' ' 103 'g' 108 'l' 95 '_' 80 'P' 111 'o'
0xbc4d48: 115 's' 105 'i' 116 't' 105 'i' 111 'o' 110 'n' 32 ' ' 61 '='
0xbc4d50: 32 ' ' 103 'g' 108 'l' 95 '_' 80 'P' 114 'r' 111 'o' 106 'j'
0xbc4d58: 101 'e' 99 'c' 116 't' 105 'i' 111 'o' 110 'n' 77 'M' 97 'a'
0xbc4d60: 116 't' 114 'r' 105 'i' 120 'x' 32 ' ' 42 '*' 32 ' ' 103 'g'
0xbc4d68: 108 'l' 95 '_' 77 'M' 111 'o' 100 'd' 101 'e' 108 'l' 86 'V'
0xbc4d70: 105 'i' 101 'e' 119 'w' 77 'M' 97 'a' 116 't' 114 'r' 105 'i'
0xbc4d78: 120 'x' 32 ' ' 42 '*' 32 ' ' 103 'g' 108 'l' 95 '_' 86 'V'
0xbc4d80: 101 'e' 114 'r' 116 't' 101 'e' 120 'x' 59 ';' 32 ' ' 125 '}'
传递给glShaderSource之前的源代码:
(gdb) print v
$1 = (const GLchar *) 0xbc4d28 "#version 120\nvoid main() { gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; }"
(gdb) x/96c 0xbc4d28
0xbc4d28: 35 '#' 118 'v' 101 'e' 114 'r' 115 's' 105 'i' 111 'o' 110 'n'
0xbc4d30: 32 ' ' 49 '1' 50 '2' 48 '0' 10 '\n' 118 'v' 111 'o' 105 'i'
0xbc4d38: 100 'd' 32 ' ' 109 'm' 97 'a' 105 'i' 110 'n' 40 '(' 41 ')'
...