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

使用纹理()时Opengl错误1282(无效操作)

蔡明贤
2023-03-14

我有以下片段着色器:

#version 330 core

layout (location = 0) out vec4 color;

uniform vec4 colour;
uniform vec2 light_pos;

in DATA
{
    vec4 position;
    vec2 texCoord;
    float tid;
    vec4 color;
} fs_in;

uniform sampler2D textures[32];

void main()
{
    float intensity = 1.0 / length(fs_in.position.xy - light_pos);

    vec4 texColor = fs_in.color;
    if (fs_in.tid > 0.0)
    {
        int tid = int(fs_in.tid + 0.5);
        texColor = texture(textures[tid], fs_in.texCoord);
    }

    color = texColor * intensity;
}

如果我运行我的程序,我得到opengl错误1282,这是无效操作。如果我不使用texture(),那么我就写texCoord=vec4(...)它工作得很完美。我总是把tid(纹理ID)作为0(没有纹理)传入,所以这个部分甚至不应该运行。我已经将纹理统一设置为某个占位符,但据我所知,这应该无关紧要。那么什么会导致无效操作呢?

共有1个答案

池砚文
2023-03-14

您的着色器编译很可能失败了。请确保在尝试编译着色器后始终检查编译状态,使用:

GLint val = GL_FALSE;
glGetShaderiv(shaderId, GL_COMPILE_STATUS, &val);
if (val != GL_TRUE)
{
    // compilation failed
}

在您的示例中,着色器是非法的,因为您试图访问具有变量索引的采样器数组:

texColor = texture(textures[tid], fs_in.texCoord);

这在GLSL3.30中是不支持的。从规范中(着重号已加):

 类似资料:
  • 我有一个非常基本的OpenGL程序,使用glfw3进行窗口操作。 这里是我的主要: Utils: 输出: 我真的不知道我做错了什么。

  • 在andrid上的opengl es中,当我将两个纹理相邻放置时,会有一个轻微的接缝,可以看到它们后面绘制的对象。基本上看起来是一个小差距。我把范围缩小到了地图上 glTexParameteri(GL_纹理_2D、GL_纹理_最小过滤器、GL_线性_MIPMAP_线性);glTexParameteri(GL_纹理_2D、GL_纹理_MAG_过滤器、GL_线性); 如果我将它们都设置为距接缝最近的G

  • 我一辈子都搞不懂这件事。我需要第二双眼睛。。。或者更好的大脑。我正在尝试让这个“Hello Triangle”python示例正常工作。我一直在翻译c教程中的内容。然而,无论我做什么,我总是会遇到这个错误。 我的代码如下。我在Mac上运行,所以你会注意到其中有些东西可能不是PC所需要的。在glDrawArrays出现之前,一切都正常。我知道C版openGL与使用pyOpenGL的python之间的

  • 所以最近我开始阅读OpenGL维基文章。这就是我在这里描述OpenGL纹理的方式。不过,有几点尚不清楚。 以下陈述是真的、假的还是视情况而定? 将两个纹理绑定到同一个纹理单元是不可能的。 将两个采样器绑定到同一个纹理单元是不可能的。 将一个纹理绑定到两个不同的纹理单元是不可能的。 将一个采样器绑定到两个不同的纹理单元是不可能的。 应用程序有责任明确将什么采样器类型传递给什么统一变量。 着色器程序有

  • 我是OpenGL新手。我将Java与LWJGL和Slick一起使用。到目前为止,我可以绘制多个纹理,使用缓冲区,我可以将屏幕上显示的图像复制到一个纹理,以便进行后处理。使用glColor3f()可以使屏幕具有所需的颜色(仅蓝色、仅红色、仅显示蓝色和绿色通道等)。 但是glColor3f(r, g, b)所做的只是将r, g, b的值乘以当前像素。如果R,G,B是像素的当前值,那么glColor对所

  • 我在C#for OpenGL 3.1中使用OpenTK包装器。我正在渲染一个场景,在这个场景中,相同的纹理用于近处和远处的对象。当我不使用MipMap时,纹理非常清晰(即使纹理对象非常小),但闪烁(如果我正确理解该术语)是可见的——当纹理对象移动到很远的地方时,纹理的像素似乎会闪烁。所以我尝试使用mipmaps。在更改为TextureMiniFilter后,请更改为LinearMipmapLine