2012-12-14 39 views
3

我在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: %s\n", 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 330\n"\ 
"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程序運行正常。但是我看不出加載是怎麼回事,因爲片段着色器的加載方式相同,編譯和運行也很好,我在編譯之前將文件打印到控制檯,看起來很好。我很聰明,我無法弄清楚問題所在。

P.S.如果有問題,我正在使用Fedora。

+0

我剛剛發現了這個問題。這肯定是由unicode編碼的文本之間的一些「複製粘貼」操作引起的,glsl編譯器會錯誤理解一些錯誤的隱藏字符,並希望獲得純粹的ascii。 –

回答

1

此編譯器錯誤通常是由尾隨垃圾引起的。最簡單的補救措施是告訴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); 
+0

忽視原始海報代碼中的錯誤,這個評論幫助我解決了同樣的問題。 ATI的驅動程序編譯我的源代碼很好,但nVidia失敗並顯示錯誤;這個建議解決了錯誤。 –

3

你打電話tempc_str()並將結果存儲在一個變量,然後修改temp和使用的c_str()所保存的結果。這不起作用,因爲如果修改字符串,c_str()的結果將變爲無效。