2014-03-06 137 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