2013-03-28 165 views
0

我正在學習OpenGL並嘗試做一些簡單的紋理。因此我提供我的紋理座標作爲屬性。無法鏈接glsl頂點着色器

我有一個奇怪的錯誤與我的頂點着色器:

#version 150 

in vec2 position; 
in vec3 color; 
in vec2 texcoord; 

out vec3 Color; 
out vec2 Texcoord; 

void main() 
{ 
    Color = color; 
    Texcoord = vec2 (1.0, 0.5); /* just for debugging hardcode texcords */ 
    gl_Position = vec4(position, 0.0, 1.0); 
} 

着色器編譯罰款,但是當我嘗試到着色器屬於glGetProgramInfoLog程序鏈接()的日誌說:

ERROR: Compiled vertex shader was corrupt.

當我刪除

in vec2 texcoord; 

錯誤消失。無論我如何命名屬性都無關緊要。只要我添加第三個我得到這個錯誤。

沒有編譯錯誤。只是這個鏈接錯誤。

我在OS X 10.8.3上使用了OpenGL 3.2 Core Context。我使用GLEW。

更新:

現在我可以鏈接此:

#version 150 

in vec2 position; 
in vec3 color; 
in vec2 texcoord; 

out vec3 Color; 
out vec2 Texcoord; 

void main() 
{ 
    Color = color; 
    gl_Position = vec4(position, 0.0, 1.0); 
} 

,但只要我添加

Texcoord = texcoord; 

的主要功能着色器被損壞。我很絕望。這是什麼?

+0

你有片段着色器中有'vec2 Texcoord'嗎? (我不確定,但可能是名稱是相同的問題,除了字母的情況下,我總是選擇不同的名稱),而編譯未使用的變量將被刪除,這將防止鏈接錯誤。 –

+0

如果您將「texcoord」重命名爲其他內容,會發生什麼情況? – bwroga

+0

它可以幫助我們,如果我們可以看到你的片段着色器以及編譯/鏈接你的程序的重要OpenGL調用的一小段摘錄。只要閱讀['#150']的規範(http://www.opengl.org/registry/doc/GLSLangSpec.1.50.11.pdf),我看不到只有你的頂點着色器有什麼問題。 – Hydronium

回答

2

您在評論上述從

const char* shaderSource = loadFile(path.c_str()).c_str(); 

改變你的代碼

string shaderString = loadFile(path.c_str()); 
const char* shaderSource = shaderString.c_str(); 

固定您的問題。

std :: string對象被銷燬,因爲沒有對它的引用,這反過來會破壞c字符串緩衝區。閱讀時緩衝區的內容是一個幸運的問題。