0

I have a very confusing error somewhere in the vertex or fragment shader. The rendering works when I do not actively use the block interface in the fragment shader. But when I am using it error 1281 occurs. Below you see the working vertex and fragment shaders. The error is discusse below the code.

Vertex shader:

#version 430

in layout (location = 0) vec3 position;
in layout (location = 1) vec4 color;
in layout (location = 2) vec3 normal;
in layout (location = 3) vec2 uv;
in layout (location = 4) vec3 tangent;
in layout (location = 5) int materialId;

uniform mat4 pr_matrix;
uniform mat4 vw_matrix = mat4(1.0);
uniform mat4 ml_matrix = mat4(1.0);


out VS_OUT {
    vec4 color;
    vec2 texture_coordinates;
    vec3 normal;
    vec3 tangent;
    vec3 binormal;
    vec3 worldPos;
    int materialIdOut;
} vs_out;

out vec4 colorOut;

void main()
{
    vs_out.color = color;
    vs_out.texture_coordinates = uv;        
    mat3 normalMatrix = transpose ( inverse ( mat3 ( ml_matrix )));
    vs_out.normal = normalize ( normalMatrix * normalize ( normal ));
    gl_Position = ( pr_matrix * vw_matrix * ml_matrix ) * vec4 ( position, 1.0);

    colorOut = vec4(vs_out.normal,1.0);
}

WORKING fragment shader (normal is used as color):

#version 430


uniform vec3 cameraPos;
uniform mat4 ml_matrix;
uniform mat4 vw_matrix;
uniform sampler2D texSlots[32];

in VS_OUT {
    vec4 color;
    vec2 texture_coordinates;
    vec3 normal;
    vec3 tangent;
    vec3 binormal;
    vec3 worldPos;
    int materialIdOut;
} fs_in;


out vec4 gl_FragColor;
in vec4 colorOut;

void main()
{
    gl_FragColor = colorOut;
}

If I am trying to use the block interface in the fragment shader like

gl_FragColor = fs_in.color;

or

gl_FragColor = vec4(fs_in.normal,1.0);

the error 1281 occurs. I really do not see why this is not working.

EDIT: solution:

there where in fact two problems:

  1. int was interpreted as float From the application I send the material attribute to the shader by using glVertexAttribPointer(SHADER_MATERIAL_INDEX, 1, GL_INT, ...); which leads to the problem, that attribute was interpreted as float in the shader By using glVertexAttribIPointerEXT(SHADER_MATERIAL_INDEX, 1, GL_INT, ...); we can overcome this problem

  2. The program linking was not successful "error c5215 integer varying must be flat" which leads to a change in the vertex and fragment shader.

    out VS_OUT { vec4 color; vec2 texture_coordinates; vec3 normal; vec3 tangent; vec3 binormal; vec3 worldPos; flat int materialIdOut; } vs_out;

and

in VS_OUT {
    vec4 color;
    vec2 texture_coordinates;
    vec3 normal;
    vec3 tangent;
    vec3 binormal;
    vec3 worldPos;
    flat int materialIdOut;
} fs_in;

Now everything works perfect

9
  • 2
    Where do you get error 1281 (GL_INVALID_VALUE)? Commented Jul 22, 2015 at 23:40
  • How is vs_out conencted to fs_in? Commented Jul 23, 2015 at 0:06
  • @AdrianKrupa: If I am substituting gl_FragColor = colorOut; by gl_FragColor = fs_in.color; the error occurs. Commented Jul 23, 2015 at 5:37
  • @immibis: the shaders are linked in the same program. the blocks have the same name and exactly the same members (ordering, types and naming). therefore, as far as I know, the should be linked automatically Commented Jul 23, 2015 at 5:40
  • What does the glGetShaderInfoLog/glProgramInfoLog say? Btw.: The blocks do not have the same name. One is called vs_out, the other one fs_in. Commented Jul 23, 2015 at 7:26

1 Answer 1

0

The problem was very unintiutive. The variable "int materialIdOut;" was incorrectly "initialized". It seems, that when I was using the block interface, the problem occurs. If not, all worked fine

EDIT: see solution in the question post

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.