2016-01-06 48 views
1

好吧,標題幾乎說明了一切,我的着色器不會鏈接。着色器不會鏈接,但沒有錯誤顯示

輸出:

[INFO|2016-01-06 18:21:27|Renderer Thread (Test window)] Shader compile status is 1, log: 
[INFO|2016-01-06 18:21:27|Renderer Thread (Test window)] Shader compile status is 1, log: 
[INFO|2016-01-06 18:21:27|Renderer Thread (Test window)] Link status: 0 
[INFO|2016-01-06 18:21:27|Renderer Thread (Test window)] Link errors: 

鏈接狀態0顯然意味着失敗。但爲什麼?很明顯,glUseProgram失敗,錯誤1282,因爲程序無法鏈接。

鏈接代碼:

int vshId = this.loadShader(this.getClass().getResource("/shaders/blocks.vsh"), GL20.GL_VERTEX_SHADER); 
    int fshId = this.loadShader(this.getClass().getResource("/shaders/blocks.fsh"), GL20.GL_FRAGMENT_SHADER); 
    int programId = GL20.glCreateProgram(); 
    GL20.glAttachShader(programId, vshId); 
    GL20.glAttachShader(programId, fshId); 
    GL20.glLinkProgram(programId); 
    GL20.glValidateProgram(programId); 
    IntBuffer buf = BufferUtils.createIntBuffer(1); 
    GL20.glGetProgramiv(programId, GL20.GL_LINK_STATUS, buf); 
    int linkStatus = buf.get(); 
    Logger.getInstance().logf("Link status: %s", linkStatus); 
    Logger.getInstance().logf("Link errors: %s", GL20.glGetProgramInfoLog(programId)); 

loadShader功能:

public int loadShader(URL resource, int type) { 
    InputStream stream; 
    try { 
     stream = resource.openStream(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return -1; 
    } 

    String s = ""; 
    byte[] b = new byte[256]; 
    try { 
     while (stream.read(b) > -1) { 
      s += new String(b); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return -2; 
    } 
    String shaderSrc = s; 
    int shaderID = GL20.glCreateShader(type); 
    GL20.glShaderSource(shaderID, shaderSrc); 
    GL20.glCompileShader(shaderID); 
    int status = GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS); 
    Logger.getInstance().logf("Shader compile status is %s, log: %s", status, GL20.glGetShaderInfoLog(shaderID)); 
    return shaderID; 
} 

這兩個片段是類SpriteManager類(https://gitlab.com/MRebhan/RetroEngine/blob/master/src/de/marco_rebhan/retroengine/texture/SpriteManager.java

片段着色器的一部分:

#version 130 

in vec2 tex_coord; 
uniform sampler2D tex; 

void main(void) { 
    gl_FragColor = texture(tex, tex_coord); 
} 

頂點着色器:

#version 130 

in vec2 position; 

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

爲什麼會發生這種情況?我沒有看到任何錯誤。當我把垃圾線放入着色器源代碼時,它說0:3(1): error: syntax error, unexpected NEW_IDENTIFIER。我明白爲什麼不能成功編譯,但我不明白爲什麼正確的着色器不工作...請幫助。

整個項目可以在https://gitlab.com/MRebhan/RetroEngine

回答

0

觀看我現在感覺非常愚蠢的。首先,在glValidateProgam出現錯誤之前調用glGetProgrami,即頂點着色器中缺少out vec2 tex_coord。 DERP。現在它正在工作。 我會把固定的版本在這裏:

頂點着色器:

#version 130 

in vec2 position; 
out vec2 tex_coord; 

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

鏈接shader代碼:

int vshId = this.loadShader(this.getClass().getResource("/shaders/blocks.vsh"), GL20.GL_VERTEX_SHADER); 
int fshId = this.loadShader(this.getClass().getResource("/shaders/blocks.fsh"), GL20.GL_FRAGMENT_SHADER); 
int programId = GL20.glCreateProgram(); 
GL20.glAttachShader(programId, vshId); 
GL20.glAttachShader(programId, fshId); 
GL20.glLinkProgram(programId); 
int linkStatus = GL20.glGetProgrami(programId, GL20.GL_LINK_STATUS); 
GL20.glValidateProgram(programId); 
Logger.getInstance().logf("Link status: %s", linkStatus); 
Logger.getInstance().logf("Link errors: %s", GL20.glGetProgramInfoLog(programId));