What's the difference between two code in shader? I'm doing a project with assimp.

I got confused with the weird situation for me.
I think the both code are exactly same, but the result is different.

Why the codes act differently?

(vertex shader)

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
layout (location = 2) in vec2 aTexCoords;

// declare an interface block; see 'Advanced GLSL' for what these are.
out VS_OUT {
    vec2 TexCoords;
} vs_out;

out vec2 TexCoords;

uniform mat4 model;
uniform mat4 projection;
uniform mat4 view;


void main()
{
    TexCoords = aTexCoords; ----(1)
    //vs_out.TexCoords = aTexCoords; ----(2) 
    gl_Position = projection * view * model * vec4(aPos, 1.0);
}


(fragment shader)

#version 330 core
out vec4 FragColor;

in VS_OUT {
    vec2 TexCoords;
} fs_in;

in vec2 TexCoords;

uniform sampler2D texture_diffuse1;
uniform vec3 lightPos;
uniform vec3 viewPos;

void main()
{
    FragColor = vec4(texture(texture_diffuse1, TexCoords).rgb, 1.0); ----(1)
    //FragColor = vec4(texture(texture_diffuse1, fs_in.TexCoords).rgb, 1.0); ----(2)
}


If I use the code above, the result is as follows



but, instead of (1) pair, if I use the pair (2), then the result is strange.



Why it happened?
I don't have enough rep to comment :(

Hi,

It looks like with (2), fs_in.TexCoords is == vec2(0.0,0.0). Do you keep both in VS_OUT {}/ out VS_OUT {} and out vec2/in vec2 ? If so, it's possible that as both have the same name (TexCoords) the compiler is confused. Try using only one of the two options.