Wednesday 15 February 2012

opengl - GLSL subroutine not recognized -



opengl - GLSL subroutine not recognized -

i have tried subroutine feature of opengl 4.0 lwjgl , can't create work. when querying gl_active_subroutine_uniform_locations, 0, , subroutine uniform. when querying each routine's index, -1, tells me don't "exist".

here shaders: vertex shader:

#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){ homecoming vec4(1.0 - color.r, 1.0 - color.g, 1.0 - color.b, color.a);} subroutine (getcolor) vec4 realcolor(vec4 color){ homecoming color;} void main(){ gl_position = projectionmatrix * viewmatrix * modelmatrix * inposition; vcolor = invertcolor(incolor);}

fragment shader:

#version 400 // smooth in vec4 vcolor; out vec4 pixel; void main(){ pixel = vcolor;}

and here's code:

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

i found it. doing stupid. before that, mixed on stackoverflow invertcolor(incolor) , getcolor(incolor):

what doing:

getcolor(incolor);

what should have been doing:

mycolor(incolor);

opengl glsl shader lwjgl

No comments:

Post a Comment