0

我试图在 GLSL 中混合两个部分重叠的纹理,我想知道我是否误解了多重纹理的概念。是否要求纹理完全重叠,或者您是否可以有两个仅在它们重叠的地方混合的偏移纹理?

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

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

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

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

4

1 回答 1

0

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

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

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

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

于 2014-03-07T02:33:13.357 回答