2016-06-08 90 views
0

我在編輯爲RGBA紋理編寫的着色器。在GLSL着色器中混合使用RGBA和ALPHA格式的圖像

這工作與RGBA紋理預期,如:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

...然後在GLSL着色器,其值可與訪問。 texture2D(tex, coord);

這一切工作正常。

然而,該軟件的一個部分使用的唯一的α-紋理
(其中其format arg是GL_ALPHA),例如:

glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA8, x, y, 0, , GL_ALPHA, GL_UNSIGNED_BYTE, NULL);

在這種情況下從texture2D() RGB成分都爲零。


雖然這是預期的行爲,我想知道是否有某種方式之一:

  • 設置只允許使用字母紋理,由texture2D
    返回RGB值(沒有按不會破壞RGBA紋理)。
  • 檢查着色器中是否有這種紋理來處理它。

注意,這可能是與預處理器來處理規定作爲最後的手段,但它已經充滿了#if的,所以我寧可如果可能避免由於預處理器組合的數量增加數我們需要存儲的着色器。

+0

」*然而,軟件的一部分使用僅alpha的紋理(其格式arg爲GL_ALPHA),例如:*「FYI:這不是」僅用於alpha的紋理「。 [像素傳輸格式](https://www.opengl.org/wiki/Pixel_Transfer#Pixel_format)描述了您要上傳的數據。紋理中的數據格式是[內部格式](https://www.opengl.org/wiki/Image_Format),您沒有看到。因此,對於我們所知道的,只有alpha的紋理實際上可能是RGBA紋理。 –

+0

@ nicol-bolas,想要避免噪音*,但你的權利,更新了問題。 – ideasman42

+0

相關問題:https://www.opengl.org/discussion_boards/showthread.php/175008-using-alpha-blending-with-shaders – ideasman42

回答

4

您可以使用texture swizzling設置從紋理的任何組件提取的值。所以如果你真的擁有一個純alpha的紋理,你可以使用swizzle mask來將RGB值設置爲1.或者通過其他三個廣播alpha值。或者您可以將它們設置爲0,但如果它們不在紋理中,則這是默認值。

//Set other components to 1. 
GLint swizzleMask[] = {GL_ONE, GL_ONE, GL_ONE, GL_ALPHA}; 
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); 

顯然紋理必須綁定這樣做。

但這些是你唯一的選擇。您不能將缺少的組件設置爲任意值。

不,沒有辦法使着色器從一個採樣器單獨檢測任何關於該紋理使用的格式。您當然可以傳遞着色器可以檢測到的制服,並使用它來更改它如何使用提取的值。它甚至不會做那麼貴,因爲你的shader代碼看起來是這樣的:

vec4 val = texture(tex_unit, ...); 
val.xyz = fill_defaults ? defaults : val.xyz; 

簡單?:上動態均勻值將會對性能沒有實質影響。 「

+0

紋理swizzle完美的作品,謝謝! – ideasman42