glShaderSource,0:1(1):错误:语法错误,意外$ end

时间:2015-03-07 01:58:11

标签: c++ pointers opengl memory-leaks shader

我已经看到了大量类似的问题,但无论我尝试什么,我都无法让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 ')'
...

0 个答案:

没有答案