代码之家  ›  专栏  ›  技术社区  ›  Shubhz

OpenGL在四边形上显示黑色纹理

  •  -1
  • Shubhz  · 技术社区  · 1 年前

    无论我尝试什么,我似乎都无法使四边形显示任何纹理,尝试在fragshader中使用纯色效果良好,尝试绘制渐变tex坐标效果良好。。当我引入一个采样器并尝试设置纹理时,它就不起作用了。。。下面附上了一些代码和调试细节 enter image description here


    int width, height, nrChannels;
    bool hasAlpha;
    unsigned int refID;
    
    glGenTextures(1, &refID);
    glBindTexture(GL_TEXTURE_2D, refID);
    
    // set the texture wrapping/filtering options (on the currently bound texture object)
    
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
    
    unsigned char* data = stbi_load("C:\\Users\\shubhz\\source\\repos\\Lumigen\\assets\\textures\\dia.png", & width, & height, & nrChannels, 0);
    
    bool has_alpha = (nrChannels > 3) ? true : false;
    
    if (data) {
        if (has_alpha)
            glTexImage2D(refID, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
        else
            glTexImage2D(refID, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    
        Debug::log("Loaded Texture from :", " w: ", width, " h:", height, " alpha : ", has_alpha, "  refID ", refID);
    }
    else {
        //Failed to load texture
        Debug::log("Failed to load texture : ");
    }
    
    //frees up the tempdata after upload
    stbi_image_free(data);
    
    app.initialize();
    
    glUseProgram(Resources::GetShader("default-shader"));
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, refID);
    glUniform1i(glGetUniformLocation(Resources::GetShader("default-shader"), "texture1"), 0);
    
    
    

    enter image description here

    绘图部分:

    void SceneRenderer::render(Mesh& _mesh, Material& _mat, glm::mat4 _modelMatrix)
    {
        glUseProgram(_mat.shader);
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, _mat.texture.refID);
        glBindVertexArray(_mesh.VAO);
    
        Shader::Mat4f(_mat.shader, "modelMatrix", _modelMatrix);
        Shader::Vec4f(_mat.shader, "_MainColor", glm::vec4(0.2f, 0.3f, 0.5f, 1));
    
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    
    }
    

    也打开了带有render doc的应用程序,在管道查看器中出现了一个奇怪的错误,显示Base_level 0中的无效维度,但我记录了宽度和高度,它们都很好

    enter image description here

    1 回复  |  直到 1 年前
        1
  •  2
  •   vallentin Remi    1 年前

    的第一个论点 glTexImage2D() 是一种纹理 target 而不是纹理句柄(在您的情况下 refID ). 所以你需要更换 参考ID 具有 GL_TEXTURE_2D :

    if (has_alpha)
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
    else
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    

    这很可能也产生了错误,所以这表明你也没有检查 glGetError() .你至少应该检查一下 glGetError() 看见 OpenGL Wiki ).

    甚至更好的设置 Debug Output .

    退房 LearnOpenGL - Debugging 有关如何调试OpenGL的更深入信息。

    推荐文章