关于c ++:片段着色器中的OpenGL错误1281(仅通过使用块接口) 您所在的位置:网站首页 opengl错误1285怎么办 关于c ++:片段着色器中的OpenGL错误1281(仅通过使用块接口)

关于c ++:片段着色器中的OpenGL错误1281(仅通过使用块接口)

2023-10-18 20:39| 来源: 网络整理| 查看: 265

我在顶点或片段着色器的某个地方有一个非常令人困惑的错误。当我不主动使用片段着色器中的块接口时,渲染工作正常。但是,当我使用它时,会发生错误1281。在下面,您可以看到有效的顶点着色器和片段着色器。错误在代码下面讨论。

顶点着色器:

123456789101112131415161718192021222324252627282930313233343536#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); }

工作片段着色器(正常用作颜色):

1234567891011121314151617181920212223242526#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,...);这导致了问题,该属性在着色器中被解释为float 通过使用glVertexAttribIPointerEXT(SHADER_MATERIAL_INDEX,1,GL_INT,...);我们可以克服这个问题 2)程序链接未成功"错误c5215整数变化必须平坦",这导致顶点和片段着色器发生变化。

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

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

现在一切正常

相关讨论 您在哪里得到错误1281(GL_INVALID_VALUE)? vs_out如何连接到fs_in? @AdrianKrupa:如果我替换gl_FragColor = colorOut; 通过gl_FragColor = fs_in.color; 错误发生。 @immibis:着色器在同一程序中链接。 这些块具有相同的名称和完全相同的成员(顺序,类型和命名)。 因此,据我所知,应该自动链接 glGetShaderInfoLog / glProgramInfoLog说什么? 顺便说一句:块名称不同。 一个称为vs_out,另一个称为fs_in。 @bobby它们没有相同的名称,一个叫做vs_out,另一个叫fs_in。 @bobby此错误是您从C ++代码获得的。 放一些 同样如BDL所述,如何检查着色器的编译/链接? @immibis:仅块名称很重要,它们是相同的。 @bobby fs_in和vs_out是什么?

这个问题很容易理解。 变量" int materialIdOut;" 被错误地"初始化"。 看来,当我使用块接口时,会出现问题。 如果没有,一切正常

编辑: 请参阅问题帖中的解决方案



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有