在 glUseProgram 中设置 GL_TEXTURE_CUBE_MAP 导致 GL_INVALID_OPERATION

Setting GL_TEXTURE_CUBE_MAP cause GL_INVALID_OPERATION in glUseProgram

我正在使用以下函数加载我的立方体贴图。没有加载,就没有错误。每当我设置立方体贴图纹理下一个 glUseProgram() 函数时,都会导致 GL_INVALID_OPERATION 错误;

unsigned int Model::loadCubemap(std::vector<std::string> faces){
    GLuint CubeMapOrder[] = {
            GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
            GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
            GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
    };
    unsigned int textureID;
    glGenTextures(1, &textureID);
    glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);

    int width, height, nrComponents;
    for (unsigned int i = 0; i < faces.size(); i++){
        unsigned char *data = stbi_load(faces[i].c_str(), &width, &height, &nrComponents, 0);
        if (data){
            GLenum format;
            if (nrComponents == 1){
                format = GL_RED;
            }else if (nrComponents == 3){
                format = GL_RGB;
            }else if (nrComponents == 4){
                format = GL_RGBA;
            }
            glTexImage2D(CubeMapOrder[i], 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
            stbi_image_free(data);
        }else{
            std::cout << "Cubemap texture failed to load at path: " << faces[i] << std::endl;
            stbi_image_free(data);
        }
    }

    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

    return textureID;
}

我正在像这样为立方体贴图着色器设置我的立方体贴图;

    GLuint TextureID  = glGetUniformLocation(ShaderProgram::shaders[shadername]->programID, "skybox");
    glActiveTexture(GL_TEXTURE8);
    glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture);
    glUniform1i(TextureID, 8);

对于第一个立方体贴图着色器,它可以工作。我看到了天空盒。但是另一个不使用天空盒纹理的着色器会出错。

两个着色器都使用相同的顶点数组对象。但是天空盒是纹理8。我认为问题是纹理参数。因为

如果我不设置这些

    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

没有问题。

我进行了一些挖掘,但找不到我的问题。

为什么设置glTexParameteri会报错,没有render。

我只是为 GL_TEXTURE_CUBE_MAP 设置一个参数。即使是错误的,为什么其他纹理会受到影响?

如果你有类似的东西

uniform samplerCube PointShadowMapTexture[MAX_POINT_LIGHT];

您必须统一 samplerCube 数组中的所有元素。否则会出现黑屏。或者您清除 color.Also 后续绘制调用可能会导致无效操作。

最好用空白 1x1 纹理统一所有未使用的采样器类型。