当前位置: 首页 > 知识库问答 >
问题:

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

长孙雅志
2023-03-14

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

出现错误1281。我真的不明白这为什么不起作用。

编辑:解决方案:

实际上有两个问题:1)int被解释为应用程序中的float,我使用glvertexattributepointer(shader_material_INDEX,1,GL_int,…)将material属性发送给着色器;这导致了问题的出现,该属性在着色器中被解释为浮动,使用了glVertexAttribIPointerEXT(shader_MATERIAL_INDEX,1,GL_INT,…);我们可以克服这个问题2)程序链接不成功“错误c5215整数变化必须平坦”,这导致顶点和片段着色器发生变化。

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;

现在一切都很完美

共有1个答案

孟承嗣
2023-03-14

这个问题很没有启发性。变量“int materialdout被错误地“初始化”。看起来,当我使用块接口时,问题出现了。如果没有,一切都很好

编辑:参见问题帖子中的解决方案

 类似资料:
  • 我真的不明白片段着色器是如何工作的。 我知道 顶点着色器每个顶点运行一次 片段着色器对每个片段运行一次 由于片段着色器不是按顶点而是按片段工作,它如何将数据发送到片段着色器?顶点的数量和片段的数量不相等。 它如何决定哪个碎片属于哪个顶点?

  • 我希望在2D OpenGL应用程序上实现着色器。我的计划是将场景渲染到帧缓冲区对象,然后使用着色器将该帧缓冲区对象渲染到屏幕。 这是我绘制到帧缓冲区对象的场景,然后从那里绘制到屏幕。使用箭头键可以让月亮四处移动(我很自豪!) 但是,当我尝试使用着色器程序将帧缓冲区对象渲染到屏幕上时,我得到以下结果: 这是非常可悲的。这个片段着色器是我从一个教程中得到的,我相信问题一定是统一变量。 以下是片段着色器

  • 我对OpenGL有点生疏,我已经实现了一个场景的照明,场景中有小行星围绕行星旋转的实例。出于某种原因,我得到的唯一输出似乎是场景的环境照明。我无法使漫反射或镜面反射工作。 这是现场的一张照片(很难看到…)仅限环境 片段着色器代码如下所示。FragPos、Normal和TexCoords都是你所期待的。纹理_diffuse1是行星/小行星纹理,具体取决于使用的着色器。LightPos可以移动,它由图

  • 我正在OpenGL中练习纹理,将定义为白色的简单纹理应用到四边形上。代码编译和运行良好,但四元体的颜色只是黑色,而不是我指定的白色。 我认为这是因为我的片段着色器没有进行正确的采样,就像它从纹理函数返回的数据都是零,因此四边形的纹理变为黑色。我之所以这么想,是因为当我运行程序时,我可以把白色变成清晰的颜色,并稍微移动四边形上的一个顶点,以便看到背景(因为它通常会填充整个曲面)。然后我可以清楚地看到

  • OpenGL的渲染管线分为几个步骤。一个简单的OpenGL渲染管线将包含一个顶点着色器和一个片段着色器。 顶点着色器接收顶点数据,并且在程序最后赋值给gl_Position。然后,顶点将会被裁剪,转换和栅格化后作为像素输出。 片段(像素)进入片段着色器,进一步对片段操作并将结果的颜色赋值给gl_FragColor。顶点着色器调用多边形每个角的点(顶点=3D中的点),负责这些点的3D处理。片段(片度