因此,我需要製作着色器以用給定顏色替換紋理中的灰色。片段着色器正常工作,如果我的顏色設置爲給定的具體的一個,像在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紋理類,但我相信這是無關緊要的。
我不確定你的意思是紋理單元。我看着谷歌,沒有發現任何確鑿的結論。正如我所說,我正在使用SlickUtil紋理加載器;我喜歡這個:TextureLoader.getTexture(「PNG」,文件),並且它返回一個Texture對象。然後,我只是做.bind()。 我沒有指定任何數字的紋理,但我認爲方法getTextureID()將返回由OpenGL(我相信是索引)分配的int。我不知道如何得到這個數字,然後('n')。 –
您可以在'glBindTexture()'中使用'getTextureID()'返回的紋理對象。至於紋理單元去,如果你只是使用一個紋理單元'0'應該沒問題。 – genpfault
您使用'glActiveTexture'設置紋理單元,然後綁定紋理。紋理單元是您發送給着色器的內容。這是一個糟糕的系統,但這就是它的工作原理! – Grimmy