Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl GLSL子例程无法识别_Opengl_Glsl_Shader_Lwjgl - Fatal编程技术网

Opengl GLSL子例程无法识别

Opengl GLSL子例程无法识别,opengl,glsl,shader,lwjgl,Opengl,Glsl,Shader,Lwjgl,我最近用lwjgl尝试了OpenGL4.0的子例程功能,但我无法让它工作。当查询GL\u ACTIVE\u SUBROUTINE\u UNIFORM\u位置时,我得到0,从而得到SUBROUTINE UNIFORM。当查询每个例程的索引时,我总是得到-1,这告诉我它们并不“存在” 以下是我的着色器: 顶点着色器: #version 400 subroutine vec4 getColor(vec4 color); uniform mat4 ProjectionMatr

我最近用lwjgl尝试了OpenGL4.0的子例程功能,但我无法让它工作。当查询GL\u ACTIVE\u SUBROUTINE\u UNIFORM\u位置时,我得到0,从而得到SUBROUTINE UNIFORM。当查询每个例程的索引时,我总是得到-1,这告诉我它们并不“存在”

以下是我的着色器: 顶点着色器:

    #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);

我找到了。我做了一件非常愚蠢的事。但在此之前,我混合了StackColor(inColor)和getColor(inColor):

我在做什么:

getColor(inColor);
我应该做的是:

myColor(inColor);