Opengl GLSL子例程无法识别
我最近用lwjgl尝试了OpenGL4.0的子例程功能,但我无法让它工作。当查询GL\u ACTIVE\u SUBROUTINE\u UNIFORM\u位置时,我得到0,从而得到SUBROUTINE UNIFORM。当查询每个例程的索引时,我总是得到-1,这告诉我它们并不“存在” 以下是我的着色器: 顶点着色器: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
#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);