Shader for textured object and material colors

Hello, I am trying to get improved specular light on a textured sphere with shaders and so far the specular part works great, but I have lost most of my material colors in the process. Here are screenshots to illustrate the problem. The sphere material has blue diffuse and black ambient.

pic 1 is without shader, pic 2 is with shader. Its hard to tell but the specular light looks way better with the shader. But I cant get the material colors to show up better, they are there but very faint. I want sphere to look like pic 1 but with the better specular. here is my shader code any help would be greatly appreciated, Ive been working on this problem for 3 days and I cant seem to get it right. Im pretty sure the problem is in last line of fragment shader “gl_FragColor=…” Im probably computing colors wrong.

varying vec3 normal,lightDir;
varying vec4 pos;
varying vec4 rawpos;

void main() {
  normal = normalize(gl_NormalMatrix * gl_Normal);
  lightDir = normalize(vec3(gl_LightSource[0].position));
  gl_Position = ftransform();
  pos = gl_ModelViewMatrix * gl_Vertex;
  rawpos = gl_Vertex;
  gl_TexCoord[0] = gl_MultiTexCoord0;

varying vec3 normal;
varying vec4 pos;
varying vec3 lightDir;
uniform sampler2D tex;

void main() {

  vec4 color = gl_FrontMaterial.diffuse;
  vec4 colorAmbient = gl_FrontMaterial.ambient;
  vec4 matspec = gl_FrontMaterial.specular;
  float shininess = gl_FrontMaterial.shininess;
  vec4 lightspec = gl_LightSource[0].specular;
  vec4 lpos = gl_LightSource[0].position;
  vec4 s = -normalize(pos-lpos);

  vec3 light =;
  vec3 n = normalize(normal);
  vec3 r = -reflect(light, n);
  r = normalize(r);
  vec3 v =;
  v = normalize(v);
  vec4 diffuse  = color * max(0.0, dot(n, * gl_LightSource[0].diffuse;
  vec4 ambient  = colorAmbient * gl_LightSource[0].ambient;
  vec4 specular;
  if (shininess != 0.0) {
    specular = lightspec * matspec * pow(max(0.0, dot(r, v)), shininess);
  } else {
    specular = vec4(0.0, 0.0, 0.0, 0.0);
  vec4 texColor = texture2D(tex,gl_TexCoord[0].st);
  vec4 endColor = mix(texColor,diffuse,0.5);
  vec4 endColor2 = mix(endColor,ambient,0.5);
  //color = (color * texColor);
  //gl_FragColor = texColor + diffuse;
 // gl_FragColor = vec4(ambient + diffuse+ specular + texColor);
  gl_FragColor = endColor2 + specular;

You shouldn't use mix for the final color… The equation is (ambient + diffuse) * texture_color + specular

AWESOME! thanks a lot  :smiley:

(ambinet + diffuse + specular)*texture_color might also work…

Usually you can get better quality if the specular color is not multiplied by the texture  :slight_smile:

You can enable that option in fixed function with LightState.setSeparateSpecular in jME.

You've got a point.