【问题标题】:OpenGL textures trigger error 1281 and strange background behaviorOpenGL 纹理触发错误 1281 和奇怪的背景行为
【发布时间】:2014-08-25 18:16:03
【问题描述】:

我正在使用 SOIL 将纹理应用于 VBO,没有纹理我可以轻松更改背景并显示黑色(默认颜色)vbo,但现在有了纹理,openGL 给出错误 1281,背景为黑色,一些纹理是没有申请。关于应用/加载纹理,一定有一些我不明白的地方。但是应用了纹理(虽然没有其他工作),当我尝试使用着色器程序时应用了错误但是我检查了这些的编译并且没有写任何问题。

这是我用来加载纹理的代码,一旦加载它就会保存在内存中,它主要来自 SOIL 的示例:

    texture = SOIL_load_OGL_single_cubemap(
    filename,
    SOIL_DDS_CUBEMAP_FACE_ORDER,
    SOIL_LOAD_AUTO,
    SOIL_CREATE_NEW_ID,
    SOIL_FLAG_POWER_OF_TWO
    | SOIL_FLAG_MIPMAPS
    | SOIL_FLAG_DDS_LOAD_DIRECT
    );
if( texture > 0 )
{
    glEnable( GL_TEXTURE_CUBE_MAP );
    glEnable( GL_TEXTURE_GEN_S );
    glEnable( GL_TEXTURE_GEN_T );
    glEnable( GL_TEXTURE_GEN_R );
    glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
    glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
    glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
    glBindTexture( GL_TEXTURE_CUBE_MAP, texture );
    std::cout << "the loaded single cube map ID was " << texture << std::endl;
} else {
    std::cout << "Attempting to load as a HDR texture" << std::endl;
    texture = SOIL_load_OGL_HDR_texture(
        filename,
        SOIL_HDR_RGBdivA2,
        0,
        SOIL_CREATE_NEW_ID,
        SOIL_FLAG_POWER_OF_TWO
        | SOIL_FLAG_MIPMAPS
        );
    if( texture < 1 )
    {
        std::cout << "Attempting to load as a simple 2D texture" << std::endl;
        texture = SOIL_load_OGL_texture(
            filename,
            SOIL_LOAD_AUTO,
            SOIL_CREATE_NEW_ID,
            SOIL_FLAG_POWER_OF_TWO
            | SOIL_FLAG_MIPMAPS
            | SOIL_FLAG_DDS_LOAD_DIRECT
            );
    }
    if( texture > 0 ) {
        //  enable texturing
        glEnable( GL_TEXTURE_2D );
        //  bind an OpenGL texture ID
        glBindTexture( GL_TEXTURE_2D, texture );
        std::cout << "the loaded texture ID was " << texture << std::endl;
    } else {
        glDisable( GL_TEXTURE_2D );
        std::cout << "Texture loading failed: '" << SOIL_last_result() << "'" << std::endl;
    }
}

以及我在绘图时如何应用它:

        GLuint TextureID  = glGetUniformLocation(shaderProgram, "myTextureSampler");
    if(!TextureID)
        cout << "TextureID not found ..." << endl;
    // glEnableVertexAttribArray(TextureID);
    glActiveTexture(GL_TEXTURE0);
    if(SFML)
        sf::Texture::bind(sfml_texture);
    else {
        glBindTexture (GL_TEXTURE_2D, texture);
        // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024, 768, 0, GL_RGB, GL_UNSIGNED_BYTE, &texture);
    }

    glUniform1i(TextureID, 0);

我不确定 SOIL 是否适合我的程序,因为我想要一些尽可能简单的东西(我使用了 sfml 的纹理对象,这是最好的,但现在我不能了),但如果我能让它工作它会很棒。

编辑:

缩小错误暗示的代码后,这里是引发它的代码,它在纹理加载和bos绘制之间调用:

    glEnableClientState(GL_VERTEX_ARRAY);
//this gives the error :
glUseProgram(this->shaderProgram);

if (!shaderLoaded)
{
    std::cout << "Loading default shaders" << std::endl;
    if(textured)
        loadShaderProgramm(texture_vertexSource, texture_fragmentSource);
    else
        loadShaderProgramm(default_vertexSource,default_fragmentSource);
}

glm::mat4 Projection = camera->getPerspective();

glm::mat4 View = camera->getView();
glm::mat4 Model = glm::mat4(1.0f);
Model[0][0] *= scale_x;
Model[1][1] *= scale_y;
Model[2][2] *= scale_z;

glm::vec3 translate_vec(this->x,this->y,this->z);
glm::mat4 object_transform = glm::translate(glm::mat4(1.0f),translate_vec);
glm::quat rotation = QAccumulative.getQuat(); 
glm::mat4 matrix_rotation = glm::mat4_cast(rotation);
object_transform *= matrix_rotation;
Model *= object_transform;

glm::mat4 MVP = Projection * View * Model;  

GLuint ModelID = glGetUniformLocation(this->shaderProgram, "M");
if(ModelID ==-1)
    cout << "ModelID not found ..." << endl;
GLuint MatrixID = glGetUniformLocation(this->shaderProgram, "MVP");
if(MatrixID ==-1)
    cout << "MatrixID not found ..." << endl;
GLuint ViewID = glGetUniformLocation(this->shaderProgram, "V");
if(ViewID ==-1)
    cout << "ViewID not found ..." << endl;

glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
glUniformMatrix4fv(ModelID, 1, GL_FALSE, &Model[0][0]);
glUniformMatrix4fv(ViewID, 1, GL_FALSE, &View[0][0]);

drawObject();

【问题讨论】:

  • 1281=0x501 即 GL_INVALID_VALUE,缩小错误首先触发的位置,然后修复之前的 glcall
  • @ratchetfreak 好的,我已经这样做了,它来自我之前的 glUseProgram 调用,让我发布代码,但是没有这些纹理,我的着色程序没有问题。
  • 当我添加使用 SFML 加载的纹理(并且仍然使用 SOILF 的纹理)时,显示纹理并且没有错误,所以我猜 SFML 做了一些修复它但我不知道是什么它是...
  • 您可能需要在调用 glUseProgram() 之前加载着色器程序。
  • @RetoKoradi glUseProgram() 之前总是被调用,正如我所说,着色器工作正常,但使用纹理时,它会崩溃。

标签: c++ opengl textures shader


【解决方案1】:

我发现了问题,我曾经在绘制后停用着色器,在那个方法中我有调用:

        sf::Texture::bind(NULL);

这也以某种方式弄乱了着色器,我刚刚对此发表了评论,现在一切正常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多