YarUnderoaker
01-28-2011, 03:36 AM
I noticed that when compiling shader, some obviously not in use attributes and uniforms remain active. This happens when the data passes through variables of structure.
Here simple program shows this issue
[Vertex shader]
#version 330
in vec3 Position;
in vec4 VertexColor;
in vec2 TexCoord0;
in vec2 TexCoord1;
in vec2 TexCoord2;
in vec2 TexCoord3;
in vec2 TexCoord4;
in vec2 TexCoord5;
in vec2 TexCoord6;
in vec2 TexCoord7;
out vec4 fVertexColor;
out vec2 fTexCoord0;
out vec2 fTexCoord1;
out vec2 fTexCoord2;
out vec2 fTexCoord3;
out vec2 fTexCoord4;
out vec2 fTexCoord5;
out vec2 fTexCoord6;
out vec2 fTexCoord7;
struct VertexRec {
vec3 Position;
vec4 VertexColor;
vec2 TexCoord0;
vec2 TexCoord1;
vec2 TexCoord2;
vec2 TexCoord3;
vec2 TexCoord4;
vec2 TexCoord5;
vec2 TexCoord6;
vec2 TexCoord7;
};
void GetVertex(inout VertexRec A)' + #10#13 +
{
A.Position = Position;
A.VertexColor = VertexColor;
A.TexCoord0 = TexCoord0;
A.TexCoord1 = TexCoord1;
A.TexCoord2 = TexCoord2;
A.TexCoord3 = TexCoord3;
A.TexCoord4 = TexCoord4;
A.TexCoord5 = TexCoord5;
A.TexCoord6 = TexCoord6;
A.TexCoord7 = TexCoord7;
return;
}
void PassVertex(inout VertexRec A)
{
gl_Position = vec4(A.Position, 1.0);
fVertexColor = A.VertexColor;
fTexCoord0 = A.TexCoord0;
fTexCoord1 = A.TexCoord1;
fTexCoord2 = A.TexCoord2;
fTexCoord3 = A.TexCoord3;
fTexCoord4 = A.TexCoord4;
fTexCoord5 = A.TexCoord5;
fTexCoord6 = A.TexCoord6;
fTexCoord7 = A.TexCoord7;
return;
}
void main()
{
VertexRec V;
GetVertex(V);
PassVertex(V);
}
[Fragment shader]
#version 330
in vec4 fVertexColor;
in vec2 fTexCoord0;
uniform sampler2D TexUnit0;
out vec4 FragColor;
void main()
{
FragColor = fVertexColor * texture(TexUnit0, fTexCoord0);
}
All vertex attributes is active, however used only Position, VertexColor, TexCoord0. If your application bind vertex arrays depend on activity of attributes, but they are not used, it can lead to an increase size of vertex and unnecessary work of GPU, and most importantly - unnecessary occupation of attribute slots.
By the way, NVidia via it CG compiler make better optimization and there no useless attributes.
PS: in Catalyst 11.1 still not work GL_ARB_get_program_binary
glGetProgramiv(ID, GL_PROGRAM_BINARY_LENGTH, @val) always return 0.
Here simple program shows this issue
[Vertex shader]
#version 330
in vec3 Position;
in vec4 VertexColor;
in vec2 TexCoord0;
in vec2 TexCoord1;
in vec2 TexCoord2;
in vec2 TexCoord3;
in vec2 TexCoord4;
in vec2 TexCoord5;
in vec2 TexCoord6;
in vec2 TexCoord7;
out vec4 fVertexColor;
out vec2 fTexCoord0;
out vec2 fTexCoord1;
out vec2 fTexCoord2;
out vec2 fTexCoord3;
out vec2 fTexCoord4;
out vec2 fTexCoord5;
out vec2 fTexCoord6;
out vec2 fTexCoord7;
struct VertexRec {
vec3 Position;
vec4 VertexColor;
vec2 TexCoord0;
vec2 TexCoord1;
vec2 TexCoord2;
vec2 TexCoord3;
vec2 TexCoord4;
vec2 TexCoord5;
vec2 TexCoord6;
vec2 TexCoord7;
};
void GetVertex(inout VertexRec A)' + #10#13 +
{
A.Position = Position;
A.VertexColor = VertexColor;
A.TexCoord0 = TexCoord0;
A.TexCoord1 = TexCoord1;
A.TexCoord2 = TexCoord2;
A.TexCoord3 = TexCoord3;
A.TexCoord4 = TexCoord4;
A.TexCoord5 = TexCoord5;
A.TexCoord6 = TexCoord6;
A.TexCoord7 = TexCoord7;
return;
}
void PassVertex(inout VertexRec A)
{
gl_Position = vec4(A.Position, 1.0);
fVertexColor = A.VertexColor;
fTexCoord0 = A.TexCoord0;
fTexCoord1 = A.TexCoord1;
fTexCoord2 = A.TexCoord2;
fTexCoord3 = A.TexCoord3;
fTexCoord4 = A.TexCoord4;
fTexCoord5 = A.TexCoord5;
fTexCoord6 = A.TexCoord6;
fTexCoord7 = A.TexCoord7;
return;
}
void main()
{
VertexRec V;
GetVertex(V);
PassVertex(V);
}
[Fragment shader]
#version 330
in vec4 fVertexColor;
in vec2 fTexCoord0;
uniform sampler2D TexUnit0;
out vec4 FragColor;
void main()
{
FragColor = fVertexColor * texture(TexUnit0, fTexCoord0);
}
All vertex attributes is active, however used only Position, VertexColor, TexCoord0. If your application bind vertex arrays depend on activity of attributes, but they are not used, it can lead to an increase size of vertex and unnecessary work of GPU, and most importantly - unnecessary occupation of attribute slots.
By the way, NVidia via it CG compiler make better optimization and there no useless attributes.
PS: in Catalyst 11.1 still not work GL_ARB_get_program_binary
glGetProgramiv(ID, GL_PROGRAM_BINARY_LENGTH, @val) always return 0.