2014-11-05 3 views
1

최근에 lwjgl을 사용하여 OpenGL 4.0의 서브 루틴 기능을 시도했지만 제대로 작동하지 않습니다. GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS를 질의 할 때, 나는 0을 얻고, 따라서 서브 루틴 유니폼을 얻습니다. 각 루틴의 인덱스를 쿼리 할 때, 나는 항상 "존재"하지 않는다고 말하는 -1을 얻습니다. 버텍스 쉐이더 :GLSL 서브 루틴을 인식하지 못했습니다.

#version 400 

    subroutine vec4 getColor(vec4 color); 

    uniform mat4 ProjectionMatrix; 
    uniform mat4 ViewMatrix; 
    uniform mat4 ModelMatrix; 

    subroutine uniform getColor myColor; 

    layout(location = 0) in vec4 inPosition; 
    layout(location = 1) in vec4 inColor; 

    // Smooth 
    out vec4 vColor; 

    subroutine (getColor) vec4 invertColor(vec4 color){ 
     return vec4(1.0 - color.r, 1.0 - color.g, 1.0 - color.b, color.a);} 

    subroutine (getColor) vec4 realColor(vec4 color){ 
     return color;} 

    void main(){ 
     gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * inPosition; 
     vColor = invertColor(inColor);} 

조각 쉐이더 : 여기

#version 400 

    // Smooth 
    in vec4 vColor; 

    out vec4 pixel; 

    void main(){ 
     pixel = vColor;} 

그리고 내 코드입니다 :

shader.useProgram(); 
    routineInvertColor = GL40.glGetSubroutineIndex(shader.getProgramId(), GL20.GL_VERTEX_SHADER, "invertColor"); 
    routineRealColor = GL40.glGetSubroutineIndex(shader.getProgramId(), GL20.GL_VERTEX_SHADER, "realColor"); 
    routineUniform = GL40.glGetSubroutineUniformLocation(shader.getProgramId(), GL20.GL_VERTEX_SHADER, "myColor"); 
    IntBuffer subroutineBuffer = BufferUtils.createIntBuffer(1).put(routineInvertColor); 

    System.out.println(GL40.glGetProgramStagei(shader.getProgramId(), GL20.GL_VERTEX_SHADER, GL40.GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS)); 
    System.out.println(routineInvertColor + " " + routineRealColor + " " + routineUniform); 

    GL40.glUniformSubroutinesu(GL20.GL_VERTEX_SHADER, subroutineBuffer); 

답변

1

내가 그것을 발견 여기

내 쉐이더입니다. 정말 바보 같은 짓하고 있었어.

내가 뭐하고 있었 무엇 :

getColor(inColor); 

내가 해왔해야합니까 :

myColor(inColor); 
하지만 그 전에, I에 유래 invertColor (inColor)와 getColor에서 (inColor)에 혼합
관련 문제