GLSL部分重叠纹理

时间:2014-03-06 12:57:37

标签: opengl glsl multitexturing

我正在尝试在GLSL中混合两个部分重叠的纹理,我想知道我是否误解了多纹理的概念。是否需要纹理完全重叠,或者您是否有两个偏移纹理仅在它们重叠的位置混合?

我有两个类似于以下的图像(减去网格线和文本): Example image

理想情况下,图像的重叠部分会很好地融合在一起,以便最终结果看起来像一个将两者结合在一起的平滑图像。例如,重叠的橙色像素会混合在一起或采用更高的强度。

我是GLSL的新手并且一直在使用这篇文章GLSL Shader Article,它使用片段着色器来混合纹理(相当标准)。

在文章之后,我@m设置每个纹理如下:

glUseProgramObjectARB( m_hProgramObject );
GLint nParamObj = glGetUniformLocationARB( m_hProgramObject, pParamName_i );
...
glActiveTexture(GL_TEXTURE0 + nTextureID_i );
glBindTexture(GL_TEXTURE_2D, nTextureID_i);
glUniform1iARB( nParamObj, nTextureID_i );

然后我绑定每个纹理并绘制三角形条带。我的纹理创建为:

glBindTexture( GL_TEXTURE_2D, m_nTextureID );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);

glTexImage2D(GL_TEXTURE_2D, 0, 4, nWidth, nHeight, 0, GL_RGBA,
    GL_UNSIGNED_BYTE, pbyData);

这个过程看起来是否合理,还是我误解了这个概念?关于如何实现这一目标的任何提示或建议?

1 个答案:

答案 0 :(得分:0)

这个过程当然似乎已经足够了。使用片段着色器的优点是可以完全控制纹理的组合方式。对于偏移,您可能需要两组纹理坐标 - 每个图像一个 - 或者您可以隐式生成它们。弄清楚你想要什么,并编写片段着色器可能是困难的一点。不幸的是,如果你想要混合许多不同的纹理,以这种方式使用的片段着色器可能会变得相当昂贵,或者只是不会使用过多的纹理。

您的示例图像看起来根本没有发生任何混合 - 图像只是位于彼此之上。在这种情况下,使用映射纹理绘制单独的几何体点会更容易。

混合通常由固定的管道混合阶段完成。例如,使用以下调用...

最常见的配置之一是使用 over 运算符进行Alpha混合:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)其中混合量由绘图颜色的alpha值给出 - 可能受到影响A纹理中的GL_RGBA组件。如果需要,您可以进一步操作混合方程。请参阅Blending