片段着色器中出现OpenGL错误1281(仅使用块接口)

wf82jlnq  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(204)

我在顶点或碎片着色器中的某个地方有一个非常令人困惑的错误。当我不主动使用片段着色器中的块接口时,渲染会起作用。但当我使用它时,出现错误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);
}

工作片段着色器(法线用作颜色):


# 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来自应用程序我使用glVertexAttribPointer(SHADER_MATERIAL_INDEX, 1, GL_INT, ...);将材质属性发送到着色器,这导致了问题,该属性在着色器中被解释为浮动通过使用glVertexAttribIPointerEXT(SHADER_MATERIAL_INDEX, 1, GL_INT, ...);我们可以克服这个问题
1.程序链接不成功“错误C5215整数变化必须是平坦的”,这导致顶点和片段着色器发生变化。

OUT VS_OUT{ve4颜色;ve2纹理坐标;ve3法线;ve3切线;ve3 Binormal;ve3 World Pos;Flat int Material IdOut;}vs_out;

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

现在一切都很完美

jvlzgdj9

jvlzgdj91#

这个问题很难解决。变量“int MaterialIdOut;”被错误地“初始化”。似乎,当我使用块接口时,问题出现了。如果不是,那么一切都很好

编辑:查看问题帖子中的解决方案

相关问题