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

在OpenGL中绑定多个纹理无法正常工作[duplicate]

昌砚
2023-03-14

我厌倦了绑定多个纹理我有一些奇怪的东西当我有两个或更多纹理时,它就结束了

主要的cpp

shaderProgram.bind();
const int NUMBER_OF_TEXTURE = textures.size();
auto sample = new int[NUMBER_OF_TEXTURE];
for (int i = 0; i < NUMBER_OF_TEXTURE; i++)
    sample[i] = i;

shaderProgram.setUniform1iv("u_Textuers", NUMBER_OF_TEXTURE, sample);
delete[] sample;

while (!glfwWindowShouldClose(window))
{
    processInput(window);

    Renderer::clear();
    shaderProgram.bind();

    for (int i = 0; i < NUMBER_OF_TEXTURE; i++)
    {
        textures[i].Bind(i);
    }
    render.draw(shaderProgram);
    GLCall(glBindTexture(GL_TEXTURE_2D, 0))


    ImGui::Render();
    ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());

    glfwSwapBuffers(window);
    glfwPollEvents();
}

纹理cpp

Texture::Texture(const FxrDataStructures::Image& image)
    :m_RendererID(0), m_LocalBuffer(nullptr),
    m_Width(0), m_Height(0), m_BPP(0)
{
    GLCall(glCreateTextures(GL_TEXTURE_2D, 1, &m_RendererID));
    GLCall(glBindTexture(GL_TEXTURE_2D, m_RendererID));

    // set the texture wrapping/filtering options (on the currently bound texture object)
    GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR))
    GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR))
    GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE))
    GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE))

    m_Width = image.getWidth();
    m_Height = image.getHeight();
    m_BPP = image.getBitDepth();

    cv::Mat mat = image.img;
    cv::flip(mat, mat, 0);
    m_LocalBuffer = mat.ptr();
    if (m_LocalBuffer)
    {
        GLCall(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Width, m_Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_LocalBuffer))
        //GLCall(glGenerateMipmap(GL_TEXTURE_2D))
    }
    else
    {
        LOG_DEBUG("Failed to load texture ");
    }
    GLCall(glBindTexture(GL_TEXTURE_2D, 0))

}

void Texture::Bind(unsigned int slot) const
{

    GLCall(glBindTextureUnit(slot, m_RendererID))
}

片段着色器

in float IndexMaterial;

uniform sampler2D u_Textuers[32];
void main()
{
    float diff;
    const int index = int(IndexMaterial);

    FragColor = vec4(texture(u_Textuers[index], TexCoord));
}

共有1个答案

邓光赫
2023-03-14

我认为这与int到float的转换有关。似乎NVIDIA GPU在插值IndexMaterial时添加了一点随机噪声,而AMD GPU则没有。

尝试为索引材质使用平面着色。这将导致GPU使用来自一个顶点的值,而不是在顶点之间进行插值:

flat in float IndexMaterial;

请参阅:glsl中的“扁平”限定符?

您还可以将IndexMaterial从float更改为int,因为它没有浮动的充分理由。

 类似资料:
  • 在我的程序中,我使用了2种纹理:t0和t1。t1是附加的,仅在某些情况下需要: 绘图着色器: 它的工作原理很好:第二个纹理在需要时首先重叠。假设使用glBindTexture(..,0)返回零纹理(0,0,0,0),但在将NVidia驱动程序更新到314.07后,我的代码会出现黑屏,比如glBindTexture(..,0)返回(0,0,0,1)纹理。 我做了一些测试:使用着色器 我在旧驱动程序(

  • 我尝试使用VBO来渲染我的3D对象。 我创建了这个类: 我的物体都渲染正确,但我有一个纹理问题。我的肌理被磨平了。看看这张图片...为什么我的纹理是这样的,以及我如何修复这个错误。 battleofground.fr_game_render_error_vbo_texture.png

  • 我正在尝试将多个纹理绑定到片段着色器中的采样器。加载代码似乎运行良好。ATI的CodeXL显示正确加载的纹理。 但是,当我将模型的纹理绑定到活动纹理0和1时,我无法让它将值发送到我的着色器。当我将着色器统一标记为usampler2D并使用uvec4存储颜色时,就像我应该做的那样,因为我的纹理是以无符号字节提供的,我得到了一个全白色的模型。当我将着色器统一更改为sampler2D并使用vec4存储颜

  • 我正在研究使用无绑定纹理来快速显示一系列图像。我的参考是OpenGL 4.5红皮书。这本书说我可以使用这个片段着色器在着色器中对无绑定纹理进行采样: 我创建了一个顶点着色器,如下所示: 正如你可能注意到的,我对发生的事情的把握有点弱。 在我的OpenGL代码中,我创建了一组纹理,获取它们的句柄,并使它们常驻。我用来获取纹理句柄的函数是“glGetTextureHandleARB”。还有另一个可以替

  • 我有一个用于OpenGL中模型渲染的纹理数组。此数组包含漫反射和镜面纹理。由于某些网格没有镜面纹理,因此我在每次渲染后简单地将NULL纹理绑定到我的镜面采样器,并且只有当网格具有镜面纹理时,我才绑定一个。但是,我仍然在没有镜面纹理的网格上看到镜面纹理。 这是我的渲染代码 材质索引保存数组中纹理的索引,如果网格没有镜面纹理 索引为-1 纹理单元0用于漫反射 纹理单元2用于镜面

  • 我对如何将纹理绑定到GLSL中的插槽有点困惑。以下是我的着色器: 当我设置矩阵时,我需要查询统一位置,然后手动设置该位置的值,执行如下操作: 然而,据我所知,我不需要这样做来初始化我的纹理采样器。在设置时,我似乎只需要这样做: 所以,我的问题是,为什么我不需要对纹理进行与矩阵相同的处理?OpenGL运行时如何“知道”我绑定的纹理应该是我定义的采样器?如果我想拥有多种纹理,我该怎么做呢?