我试图在GLSL中混合两个部分重叠的纹理,我想知道我是否误解了多重纹理的概念。是否需要纹理完全重叠,或者可以有两个仅在重叠处混合的偏移纹理?
我有两个类似于以下的图像(减去网格线和文本):示例图像
理想情况下,图像的重叠部分会很好地融合在一起,这样最终的结果看起来就像是一个将两者结合在一起的平滑图像。例如,重叠的橙色像素会混合在一起或具有更高的强度。
我是GLSL的新手,一直在使用这篇文章GLSL着色器文章,它使用片段着色器来混合纹理(相当标准)。
在文章之后,我将每个纹理设置为:
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);
这个过程看起来合理吗?还是我误解了这个概念?关于如何实现这一点,有什么建议或建议吗?
这个过程看起来确实足够了。使用片段着色器的优点是可以完全控制纹理的组合方式。对于偏移,您可能需要两组纹理坐标(每个图像一组),或者可以隐式生成它们。弄清楚你想要什么和编写碎片着色器可能是困难的一点。不幸的是,如果你想混合许多不同的纹理,以这种方式使用的碎片着色器可能会非常昂贵,或者无法处理太多绑定的纹理。
您的示例图像看起来根本没有发生任何混合——图像只是位于彼此之上。在这种情况下,只需使用贴图纹理绘制单独的几何体部分就更容易了。
混合通常通过固定管道混合阶段完成。例如,使用以下调用。。。
glEnable(GL_BLEND)
glBlendFunc(src_scale, dest_scale)
最常见的配置之一是使用over运算符进行alpha混合:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
,其中混合量由图形颜色的alpha值给定,可能受GL_RGBA
纹理中A
分量的影响。如果需要,可以进一步操作混合方程式。请参见混合。