2015-03-18 45 views
0

我一直盯着這個太久了,我對GLSL來說太陌生,不知道什麼是錯的。我所知道的是,當檢查頂點着色器是否編譯時,它說它不能這樣做。如果有人能幫我找出我做錯了什麼,那將是驚人的。GLSL着色器不會編譯,有人可以幫我找出原因嗎?

textureShader.vert

#version 140 

uniform mat4 mvpMatrix; 

attribute vec3 position; 
attribute vec2 textCoord; 

varying vec2 TextCoord; 
varying vec3 lightDir,normal; 

void main() 
{ 
    normal = normalize(gl_NormalMatrix * gl_Normal); 

    lightDir = normalize(vec3(gl_LightSource[0].position)); 
    gl_TexCoord[0] = gl_MultiTexCoord0; 

    gl_Position = position; 
} 

textureShader.frag

#version 140 

uniform sampler2D texUnit; 

varying vec2 TextCoord; 
varying vec3 lightDir,normal; 

void main() 
{ 
    vec3 ct,cf; 
    vec4 texel; 
    float intensity,at,af; 
    intensity = max(dot(lightDir,normalize(normal)),0.0); 

    cf = intensity * (gl_FrontMaterial.diffuse).rgb + gl_FrontMaterial.ambient.rgb; 
    af = gl_FrontMaterial.diffuse.a; 
    texel = texture2D(texUnit, TextCoord); 

    ct = texel.rgb; 
    at = texel.a; 
    gl_FragColor = vec4(ct * cf, at * af); 

} 

我在做什麼檢查彙編。 DBOUT是寫入Visual Studio輸出框的函數。

glCompileShader(shader_vp); 
validateShader(shader_vp, vsFile); 

GLint compiled; 
glGetShaderiv(shader_vp, GL_COMPILE_STATUS, &compiled); 
if (!compiled){ 
    DBOUT("Couldn't Compile Vertex Shader: Aborting Mission\n"); 
    abort(); 
} 


glCompileShader(shader_fp); 
validateShader(shader_fp, fsFile); 

glGetShaderiv(shader_fp, GL_COMPILE_STATUS, &compiled); 

if (!compiled){ 
    DBOUT("Couldn't Compile Fragment Shader: Aborting Mission\n"); 
    abort(); 
} 

輸出我得到:

Couldn't Compile Vertex Shader: Aborting Mission 
Debug Error! 

解決

因此,與大家的幫助,我走這編譯。我不得不更換這些線路:

gl_TexCoord[0] = gl_MultiTexCoord0; 

    gl_Position = position; 

有了這些的:

TextCoord = vec2(textCoord); 

    gl_Position = mvpMatrix * vec4(position,1.0f); 

謝謝大家!

+1

用glGetShaderInfoLog獲取日誌並打印 – 2015-03-18 21:20:30

+0

檢查日誌,發佈MCVE等。確保你的'#version'指令行在最後有一個換行符。 – genpfault 2015-03-18 22:10:30

+0

@ratchetfreak打印信息日誌給我以下 E – 2015-03-18 22:25:14

回答

3

我不敢看你的着色器,但你可以像您可以通過編譯器的錯誤信息:

auto error = GLint(); 

::glGetShaderiv(id, GL_COMPILE_STATUS, &error); 

if(error != GL_TRUE) 
{  
    auto length = GLint(); 

    ::glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length); 

    if(length > 0) 
    { 
     auto log = std::vector<GLchar>(length, 0); 

     ::glGetShaderInfoLog(id, length, nullptr, &log[0]); 

     auto message = std::string(log.begin(), log.end()); 
     ... 
    } 
} 
+0

解決!謝謝! – 2015-03-19 17:36:35

+0

需要說...如果您通過編寫'= GLint()'來編譯器推斷它的類型,我在聲明'auto'時看不到太多用處。似乎你可以節省大量的輸入,如果你不使用'auto'的話。 – 2015-03-20 03:32:40

+0

我使用汽車無處不在,那種聲明確保它始終被初始化。不幸的是,編譯器無法推斷出該變量將來使用的類型。這只是我使用的一個通用規則。 – Robinson 2015-03-20 10:39:20

1

着色器的一個可能的錯誤可能是:

GL_POSITION =位置;

的GL_POSITION的類型應該vec4的,但位置VEC3的屬性,你可能忘了做這樣的事情:

GL_POSITION = mvpMatrix * vec4(位置,1.0F);

+0

更改這給了我一個不同的錯誤,所以我不完全確定是否只是一件事出錯。完成這個改變後,我在這個調用中得到一個新的錯誤(用glGetError()檢查): glEnableVertexAttribArray(tCoordLoc [i]); – 2015-03-19 16:11:15

+0

好的,着色器錯誤消失了,對吧? glEnableVertexAttribArray不是顯示的代碼的一部分,所以我不確定,但我猜你通過了錯誤的參數。此函數用於啓用您使用glVertexAttribPointer指定的vertexAttrib而不是統一的位置。 – 2015-03-19 16:51:14

+0

解決!謝謝! – 2015-03-19 17:36:45

相關問題