片段着色器中的 OpenGL 错误 1281(仅通过使用块接口)
OpenGL Error 1281 in fragment shader (only by using block interface)
我在顶点或片段着色器的某个地方遇到了一个非常令人困惑的错误。当我不主动使用片段着色器中的块接口时,渲染工作正常。但是当我使用它时出现错误 1281。下面您可以看到工作中的顶点和片段着色器。该错误在代码下方讨论。
顶点着色器:
#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 片段着色器(法线用作颜色):
#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;
}
如果我尝试在片段着色器中使用块接口,例如
gl_FragColor = fs_in.color;
要么
gl_FragColor = vec4(fs_in.normal,1.0);
出现错误1281。我真的不明白为什么这不起作用。
编辑:解决方案:
实际上有两个问题:
1) int 被解释为 float
从应用程序中,我通过使用将 material 属性发送到着色器
glVertexAttribPointer(SHADER_MATERIAL_INDEX, 1, GL_INT, ...);这导致了问题,该属性在着色器中被解释为浮点数
通过使用 glVertexAttribIPointerEXT(SHADER_MATERIAL_INDEX, 1, GL_INT, ...);我们可以克服这个问题
2)程序链接不成功"error c5215 integer varying must be flat"导致顶点和片段着色器发生变化。
out VS_OUT {
vec4 color;
vec2 texture_coordinates;
vec3 normal;
vec3 tangent;
vec3 binormal;
vec3 worldPos;
flat int materialIdOut;
} vs_out;
和
in VS_OUT {
vec4 color;
vec2 texture_coordinates;
vec3 normal;
vec3 tangent;
vec3 binormal;
vec3 worldPos;
flat int materialIdOut;
} fs_in;
现在一切正常
问题很不直观。变量 "int materialIdOut;" 被错误地 "initialized"。看来,当我使用块接口时,出现了问题。如果没有,一切正常
编辑:
查看问题 post
中的解决方案
我在顶点或片段着色器的某个地方遇到了一个非常令人困惑的错误。当我不主动使用片段着色器中的块接口时,渲染工作正常。但是当我使用它时出现错误 1281。下面您可以看到工作中的顶点和片段着色器。该错误在代码下方讨论。
顶点着色器:
#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 片段着色器(法线用作颜色):
#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;
}
如果我尝试在片段着色器中使用块接口,例如 gl_FragColor = fs_in.color; 要么 gl_FragColor = vec4(fs_in.normal,1.0);
出现错误1281。我真的不明白为什么这不起作用。
编辑:解决方案:
实际上有两个问题: 1) int 被解释为 float 从应用程序中,我通过使用将 material 属性发送到着色器 glVertexAttribPointer(SHADER_MATERIAL_INDEX, 1, GL_INT, ...);这导致了问题,该属性在着色器中被解释为浮点数 通过使用 glVertexAttribIPointerEXT(SHADER_MATERIAL_INDEX, 1, GL_INT, ...);我们可以克服这个问题 2)程序链接不成功"error c5215 integer varying must be flat"导致顶点和片段着色器发生变化。
out VS_OUT {
vec4 color;
vec2 texture_coordinates;
vec3 normal;
vec3 tangent;
vec3 binormal;
vec3 worldPos;
flat int materialIdOut;
} vs_out;
和
in VS_OUT {
vec4 color;
vec2 texture_coordinates;
vec3 normal;
vec3 tangent;
vec3 binormal;
vec3 worldPos;
flat int materialIdOut;
} fs_in;
现在一切正常
问题很不直观。变量 "int materialIdOut;" 被错误地 "initialized"。看来,当我使用块接口时,出现了问题。如果没有,一切正常
编辑: 查看问题 post
中的解决方案