2016-11-18 54 views
-1

我正在渲染一個圓形紋理到opengl中的三角形。這工作正常。opengl:混合具有跨平臺不一致的結果

我啓用GL_BLEND,設置我想要的顏色,然後使用glBlendFunc與GL_ONE和GL_ONE_MINUS_SRC_ALPHA。

glEnable(GL_BLEND); 
glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA); 
glColor4(0x0,0xCC,0x0,0xFF); 

在我的主要平臺(Linux)的我得到我想要的,這裏呈現一個圈子已經沒有方的背景和渲染圈旁邊的海誓山盟看起來如預期的結果。

但是,如果我改變平臺,在這種情況下,以Windows 10,我懷疑這可能不僅僅是一個Windows-Linux的問題,但也硬件依賴?我得到這些結果 green circles

取而代之的是,圓形紋理呈現爲似乎是半透明的白色背景。因此,在彼此之上渲染圓圈會產生奇怪的結果。

如果我使用GL_SRC_ALPHA作爲我的第一個blendfunc參數,我將刪除該問題,但是在平臺之間再次出現不一致的問題時,該紋理在邊緣處具有灰色。

+0

確保你在相同條件下進行測試:紋理中的alpha是什麼(它可能是圖像加載器問題,而不是GL本身)?兩個平臺上有什麼gfx /驅動程序?這兩個平臺中的像素格式是什麼? (bits'per'r,g,b,a') – Spektre

+0

@Spektre具體來說,我的圖像是[this](http://i.imgur.com/Fvzd68b.png),沒有255 alpha的任何像素之外都有0個alpha。它使用'glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,寬度,高度,0,GL_BGRA,GL_UNSIGNEDBYTE,scan0)加載;'並加載正常,加載後也使用'glGenerateMipMap'。我在Linux上使用[radeon開源驅動程序](https://wiki.freedesktop.org/xorg/radeon/),以及Windows上典型的最新驅動程序Radeon R9 280x,絕不是過時的卡。最後,我的像素格式是32位/像素(8888)。 – cloud

+0

'glTexImage2D'將圖像從CPU內存加載到GL內存作爲紋理,但是您是如何將圖像從文件加載到CPU內存的? (即圖像加載器及其行爲在不同平臺上可能會有所不同) – Spektre

回答

0

不一致性最終成爲每個平臺上圖像加載器實現的差異,但有趣的是,我沒有通過更改圖像加載器來解決它。

我其實只是改變了圖像的保存方式。在瘸子中,過程是:導出圖像(如PNG) - >禁用「保存背景顏色」 - >禁用「從透明像素保存顏色值」,現在問題不再出現。