2014-03-06 97 views
0

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

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

理想情况下,图像的重叠部分将一起很好地混合,以使最终结果将类似于一个平滑的图像即将两者结合在一起。例如,重叠橙色像素会混合在一起或采取较高的强度。

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

继文章,I @ 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); 

这个过程看起来是否合理或者我误解了这个概念?有关如何实现此目的的任何提示或建议?

回答

0

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

您的示例图像看起来没有任何混合发生 - 图像刚好位于彼此之上。在这种情况下,仅通过绘制贴图纹理绘制单独的几何图形比较容易。

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

其中最常见的配置的是α-与超过操作者共混:其中配合量给出glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)通过您的绘图颜色的alpha值 - 可能受到您的GL_RGBA纹理中的A组件的影响。如果需要,您可以进一步操作混合等式。见Blending

+0

在进一步思考之后,情况并不像我想象的那么简单。我实际上想要做的是渲染两个正方形纹理作为重叠的圆圈(三角形粉丝)。混合是这样做的显而易见的方式,虽然我还没有找到一个很好的混合配置。我的想法是,着色器可以提供一种手段来获得更多的完整的alpha图像,而不是两个重叠的半透明图像。我可能会考虑使用着色器与渲染到纹理相结合。 – TheShiftingInt