【问题标题】:OpenGL multiple textures, one works, other appears brownOpenGL多个纹理,一个有效,另一个出现棕色
【发布时间】:2014-04-15 12:08:16
【问题描述】:

我有一个程序加载背景纹理,然后加载模型,其中包含一些可能已分配纹理的材料(加载工作正常)。

渲染时,首先绑定背景纹理,然后使用自己的渲染调用等渲染背景。

然后渲染模型(包括在渲染特定材质时绑定模型纹理,等等)。

问题:背景显示正常,但模型没有纹理。它是一种均匀的浅棕色。

我需要使用多个纹理单元吗?

更多信息:我正在将此程序从使用固定功能管道转换为使用着色器。目前背景以旧方式渲染,但我使用着色器来渲染模型。我感到困惑的原因是,如果我使用固定管道渲染模型,纹理会显示得很好,但是一旦我使用我的着色器程序,它就会变成均匀的棕色。

我在加载着色器后设置glUniform1i(texture_sampler_uniform_location, 0);

【问题讨论】:

    标签: opengl textures shader


    【解决方案1】:

    加载着色器后s

    我认为这就是你的问题所在。每个着色器的统一值是单独的,因此您必须为每个着色器程序指定它们。您提出问题的方式暗示,您只设置了一次统一值,期望它在所有着色器之间共享。

    统一的棕色也表示没有应用适当的纹理坐标。您的顶点和片段着色器代码是什么样的,您如何提供纹理坐标?

    【讨论】:

    • “均匀的棕色表示,没有应用适当的纹理坐标”谢谢,至少澄清了原因。只有一个着色器程序使用制服,所以这不是问题。我现在实际上已经修复了它,但不确定我是如何或在哪里完成的。删除了所有 glActiveTexture 调用和其他一些 duff 代码。我想我最初对透明纹理感到困惑,这导致了不必要的更改,从而破坏了代码。然后意识到我所要做的就是将 alpha 值设置为 1.0,但到那时它已经从“假定的修复”-> 棕色纹理中破坏了。对不起!
    【解决方案2】:

    如果你想使用多个纹理,那么你也需要使用glActiveTexture(GLenum texture)

    基本上你像你已经做的那样初始化你的着色器,虽然你需要为每个纹理句柄做它。

    glUniform1i(texture1_sampler_uniform_location, 0);
    glUniform1i(texture2_sampler_uniform_location, 1);
    

    然后当你想要渲染和使用纹理时,你可以执行以下操作。

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture1_handle);
    
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, texture2_handle);
    

    【讨论】:

    • 我认为 OP 只是想切换纹理。为此,您不需要使用多个纹理单元(如果是这种情况,您很快就会用完纹理单元)。
    • @datenwolf 我似乎读过它,OP 不能使用多个纹理,这意味着需要使用glActiveTexture
    • OP 写了Problem: The background shows up fine, but the model is not textured. It is a uniform light brown colour.——这不是多纹理问题,而是纹理切换问题。
    • 确实是贴图切换的问题,给您造成困扰,见谅。
    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2020-01-16
    • 1970-01-01
    • 2012-04-16
    相关资源
    最近更新 更多