【问题标题】:What's the proper way to do multitexturing in GLSL with independent texture coordinates?在具有独立纹理坐标的 GLSL 中进行多重纹理处理的正确方法是什么?
【发布时间】:2015-08-11 11:34:06
【问题描述】:

多重纹理曾经简单明了。你绑定你的纹理,你调用glBegin,然后你进行渲染,除了glTexCoord,你为每个纹理调用glMultiTexCoord。然后所有这些都被弃用了。

我现在正在四处寻找正确的方法,但我找到的所有教程,无论是来自官方 Khronos Group 资源还是博客,都假设您想要使用相同的纹理坐标集对于您的所有纹理,这是一个非常简单的假设,不适用于我的用例。

假设我有纹理 A 和纹理 B,我想渲染纹理 B 中的颜色,在矩形 rB 中,使用纹理 A 中的 alpha 值,在矩形 rA 中,(它有与rB 相同的高度和宽度,为简单起见,但Left 和Top 值不同),使用OpenGL 3,没有任何不推荐使用的功能。这样做的正确方法是什么?

【问题讨论】:

  • 先找一个使用shader、VBOs和VAO的教程,应该会比较清楚。 glBegin 和朋友已弃用。
  • @ratchetfreak:是的,我知道它已被弃用。这就是我问的原因。到目前为止,我发现的所有着色器教程都没有用,因为它们都假设您希望两种纹理都使用相同的矩形。
  • 你所做的就是添加另一个顶点属性,另一个输入流到着色器并利用这些坐标。它们的处理方式与第一组相同。
  • 在我看来,多重纹理现在更容易、更直接了。您不需要为每个纹理单元设置一组单独的纹理坐标(尽管如果您愿意,您仍然可以这样做,并且显然在这种情况下您可以这样做)。您不需要设置人造可编程组合器等。只需使用您想要的坐标变量并使用您想要组合结果的任何操作对纹理进行采样。也许easy这个词不太合适,但它非常简单。
  • 原始重启索引可以让你做到这一点。在条形/扇形中,您可以插入一个特殊的数字(例如 -1),光栅器将停止连接图元并在下一个索引处开始一个新的图元。这肯定不是直截了当的,但如果你想一起破解类似的东西,它就可以工作。不过,您可能最好使用几何着色器——将点数从 6 减少到 1 :)

标签: opengl glsl multitexturing


【解决方案1】:

在着色器中,您只需声明(并使用)一组额外的纹理坐标和第二个采样器。

vec4 sample1 = texture(texture1, texCoord1);
vec4 sample2 = texture(texture2, texCoord2);

在指定模型时,将第二组 texCoords 添加到属性中:

glVertexAttribPointer(tex1Loc, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(texCoord1, Vertex));
glVertexAttribPointer(tex2LOC, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(texCoord2, Vertex));

【讨论】:

    猜你喜欢
    • 2015-09-30
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多