2013-06-12 64 views
4

因此,我需要製作着色器以用給定顏色替換紋理中的灰色。片段着色器正常工作,如果我的顏色設置爲給定的具體的一個,像在OpenGL的片段着色器中獲取原始紋理顏色

gl_FragColor = vec4(1, 1, 0, 1); 

然而,當我嘗試檢索紋理原來的顏色,我得到一個錯誤。由於某種原因,它總是返回黑色。

uniform sampler2D texture; //texture to change 

void main() { 
    vec2 coords = gl_TexCoord[0].xy; 
    vec3 normalColor = texture2D(texture, coords).rgb; //original color 

    gl_FragColor = vec4(normalColor.r, normalColor.g, normalColor.b, 1); 
} 

從理論上講,它應該做什麼 - 質地應該是不變的。但它完全是黑色的。我認爲問題在於我不確定如何將紋理作爲參數傳遞給統一變量。我目前使用ID(整數),但它似乎總是返回黑色。所以我基本上不知道如何設置統一紋理的值(或者以任何其他方式得到它,而不使用參數)。代碼(在Java中):

program.setUniform("texture", t.getTextureID()); 

我使用的程序類,我從here了,也SlickUtils紋理類,但我相信這是無關緊要的。

回答

8
program.setUniform("texture", t.getTextureID()); 
           ^^^^^^^^^^^^^^^^ 

不準不準。

紋理對象ID 從不穿制服。

傳入要從中採樣的紋理單位的索引。

所以如果你想從n個紋理單元(GL_TEXTURE0 + n)傳遞n採樣:

program.setUniform("texture", 0); 
          ^or whatever texture unit you've bound `t` to 
+0

我不確定你的意思是紋理單元。我看着谷歌,沒有發現任何確鑿的結論。正如我所說,我正在使用SlickUtil紋理加載器;我喜歡這個:TextureLoader.getTexture(「PNG」,文件),並且它返回一個Texture對象。然後,我只是做.bind()。 我沒有指定任何數字的紋理,但我認爲方法getTextureID()將返回由OpenGL(我相信是索引)分配的int。我不知道如何得到這個數字,然後('n')。 –

+0

您可以在'glBindTexture()'中使用'getTextureID()'返回的紋理對象。至於紋理單元去,如果你只是使用一個紋理單元'0'應該沒問題。 – genpfault

+1

您使用'glActiveTexture'設置紋理單元,然後綁定紋理。紋理單元是您發送給着色器的內容。這是一個糟糕的系統,但這就是它的工作原理! – Grimmy

0

除了說什麼genpfault,當你說「取代與質感的灰色給定顏色「,其中更好是」將顏色從一個紋理寫入另一個紋理的簡寫,除了用不同的顏色替換灰色「。因爲你不允許simultaneously read from and write to the same image in the same texture

+0

那麼,這是一個不便。我不需要在圖像中寫入,只需閱讀並顯示 - 那麼可以嗎?我的問題是這樣的:我的遊戲有幾艘船,每艘都有一個特定的狀態集。根據狀態設置,我想改變船的顏色,但只能在圖像的真實灰色部分(其他像素總是相同)。我相信每次畫船時都會創建一個紋理並不好。所以,我必須保留一張紋理和狀態設置的地圖,以便我可以重複使用已經繪製的船舶紋理 - 是嗎? –

+0

@LuanNico:你可以做任何你想做的事情(在這方面),只要你不是從你正在寫的圖片中讀取。此外,請停止使用灰色;灰色太常見了一種顏色。這種顏色鍵控的標準顏色是(255,0,255);沒有人曾經故意使用過它。 –

相關問題