所以,我需要制作一个着色器,用给定的颜色替换纹理中的灰色。如果我将颜色设置为给定的特定颜色,片段着色器可以正常工作,如
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获得的Program类,以及SlickUtils Texture类,但我认为这是无关紧要的。
答案 0 :(得分:8)
program.setUniform("texture", t.getTextureID());
^^^^^^^^^^^^^^^^
Nope nope nope。
纹理对象ID 永远不会穿制服。
传入要从中采样的纹理单元的索引。
因此,如果您想从n
纹理单元(GL_TEXTURE0 + n
)中抽样,请传递n
:
program.setUniform("texture", 0);
^ or whatever texture unit you've bound `t` to
答案 1 :(得分:0)
除了genpfault所说的,当你说“用给定颜色替换纹理中的灰色”时,更好是“将颜色从一个纹理写入另一个纹理”的简写,除了用不同的颜色替换灰色“。因为您不被允许simultaneously read from and write to the same image in the same texture。