Luan Nico
Luan Nico

Reputation: 5927

Get original texture color in a Fragment Shader in OpenGL

So, I need to make a shader to replace the gray colors in the texture with a given color. The fragment shader works properly if I set the color to a given specific one, like

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

However, I'm getting an error when I try to retrieve the original color of the texture. It always return black, for some reason.

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);
}

Theoretically, it should do nothing - the texture should be unchanged. But it gets entirely black instead. I think the problem is that I'm not sure how to pass the texture as a parameter (to the uniform variable). I'm currently using the ID (integer), but it seems to return always black. So I basically don't know how to set the value of the uniform texture (or to get it in any other way, without using the parameters). The code (in Java):

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

I'm using the Program class, that I got from here, and also SlickUtils Texture class, but I believe that is irrelevant.

Upvotes: 4

Views: 3978

Answers (2)

Nicol Bolas
Nicol Bolas

Reputation: 474486

In addition to what genpfault said, when you say "replace the gray colors in the texture with a given color", that had better be a shorthand for "write the color from one texture to another, except replacing gray with a different color". Because you are not allowed to simultaneously read from and write to the same image in the same texture.

Upvotes: 0

genpfault
genpfault

Reputation: 52167

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

Nope nope nope.

Texture object IDs never go in uniforms.

Pass in the index of the texture unit you want to sample from.

So if you want to sample from the nth texture unit (GL_TEXTURE0 + n) pass in n:

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

Upvotes: 8

Related Questions