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