【问题标题】:OpenGL 3.3 - I can only bind to GL_TEXTURE0OpenGL 3.3 - 我只能绑定到 GL_TEXTURE0
【发布时间】:2015-05-07 10:27:32
【问题描述】:

一段时间以来,我一直在尝试遵循 OpenGL-3.3 教程,但似乎我只能将纹理绑定到 GL_TEXTURE0,否则我会得到一个黑色方块。

例子:

这行得通

    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glActiveTexture(GL_TEXTURE0 + 0);
    glBindTexture(GL_TEXTURE_2D, texture1);
    glUniform1i(glGetUniformLocation(shader.program, "our_texture1"), 0);

    shader.bind();

    glBindVertexArray(vertex_array);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    glBindVertexArray(0);

这不是

    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glActiveTexture(GL_TEXTURE0 + 1);
    glBindTexture(GL_TEXTURE_2D, texture1);
    glUniform1i(glGetUniformLocation(shader.program, "our_texture1"), 1);

    shader.bind();

    glBindVertexArray(vertex_array);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    glBindVertexArray(0);

详情:

shader.bind 只是调用glUseProgram

顶点着色器:

     #version 330 core

    layout (location = 0) in vec3 position;
    layout (location = 1) in vec3 color;
    layout (location = 2) in vec2 tex_coords;
    out vec4 our_color;
    out vec2 our_tex_coords;

    void main()
    {
        gl_Position = vec4(position, 1.0f);
        our_color = vec4(color, 1.0f);
        our_tex_coords = tex_coords;
    }

片段着色器:

    #version 330 core

    out vec4 color;
    in vec4 our_color;
    in vec2 our_tex_coords;

    uniform sampler2D our_texture1;

    void main()
    {
        color = texture(our_texture1, our_tex_coords);
    }

纹理创建:

    GLuint texture1;

    glGenTextures(1, &texture1);
    glBindTexture(GL_TEXTURE_2D, texture1);

    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);

    sf::Image image1;
    if (!image1.loadFromFile("../Assets/container.jpg"))
    {
        error();
    }

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image1.getSize().x, image1.getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, image1.getPixelsPtr());
    glGenerateMipmap(GL_TEXTURE_2D);

    glBindTexture(GL_TEXTURE_2D, 0);

据我所知,文件已正确加载。知道可能出了什么问题吗?

【问题讨论】:

    标签: c++ opengl textures sfml


    【解决方案1】:

    较早的答案告诉您如何更改代码以使其工作,但给出了错误的解释。按此顺序:

    glActiveTexture(GL_TEXTURE0 + 1);
    glBindTexture(GL_TEXTURE_2D, texture1);
    glUniform1i(glGetUniformLocation(shader.program, "our_texture1"), 1);
    
    shader.bind();
    

    shader.bind()调用glUseProgram(),确实是顺序有问题。但它与glActiveTexture()无关,与当前绑定的程序完全无关。

    glUniform1i() 调用在当前绑定的程序上设置一个统一的值。所以关键是你打电话给glUseProgram()之前glUniform*()。例如,以下顺序将起作用:

    glActiveTexture(GL_TEXTURE0 + 1);
    glBindTexture(GL_TEXTURE_2D, texture1);
    
    shader.bind();
    glUniform1i(glGetUniformLocation(shader.program, "our_texture1"), 1);
    

    【讨论】:

    • 这是有道理的。我实际上对这个调用持怀疑态度,但因为我们在 GetUniform 函数中使用着色器的程序成员这一事实而感到困惑。这可能甚至不是一个好习惯。感谢您提供正确答案!
    【解决方案2】:

    您的代码看起来不错。 但我认为通常应该在 glActiveTexture 之前调用 shader.bind()。

    进一步提示:如果您希望在使用缩小时对纹理进行抗锯齿处理,请使用 GL_LINEAR_MIPMAP_LINEAR 而不是 GL_LINEAR。这应该是开箱即用的,因为您已经生成了 MIPMap。

    最好的问候, 克里斯

    【讨论】:

    • 克里斯感谢您的帮助!即使你的答案不正确,你也帮我解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多