Clone of mesa.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

CH11-toyball.frag.txt 2.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //
  2. // Fragment shader for procedurally generated toy ball
  3. //
  4. // Author: Bill Licea-Kane
  5. //
  6. // Copyright (c) 2002-2003 ATI Research
  7. //
  8. // See ATI-License.txt for license information
  9. //
  10. varying vec4 ECposition; // surface position in eye coordinates
  11. varying vec4 ECballCenter; // ball center in eye coordinates
  12. uniform vec4 LightDir; // light direction, should be normalized
  13. uniform vec4 HVector; // reflection vector for infinite light source
  14. uniform vec4 SpecularColor;
  15. uniform vec4 Red, Yellow, Blue;
  16. uniform vec4 HalfSpace0; // half-spaces used to define star pattern
  17. uniform vec4 HalfSpace1;
  18. uniform vec4 HalfSpace2;
  19. uniform vec4 HalfSpace3;
  20. uniform vec4 HalfSpace4;
  21. uniform float InOrOutInit; // = -3
  22. uniform float StripeWidth; // = 0.3
  23. uniform float FWidth; // = 0.005
  24. void main()
  25. {
  26. vec4 normal; // Analytically computed normal
  27. vec4 p; // Point in shader space
  28. vec4 surfColor; // Computed color of the surface
  29. float intensity; // Computed light intensity
  30. vec4 distance; // Computed distance values
  31. float inorout; // Counter for computing star pattern
  32. p.xyz = normalize(ECposition.xyz - ECballCenter.xyz); // Calculate p
  33. p.w = 1.0;
  34. inorout = InOrOutInit; // initialize inorout to -3
  35. distance[0] = dot(p, HalfSpace0);
  36. distance[1] = dot(p, HalfSpace1);
  37. distance[2] = dot(p, HalfSpace2);
  38. distance[3] = dot(p, HalfSpace3);
  39. distance = smoothstep(-FWidth, FWidth, distance);
  40. inorout += dot(distance, vec4(1.0));
  41. distance.x = dot(p, HalfSpace4);
  42. distance.y = StripeWidth - abs(p.z);
  43. distance = smoothstep(-FWidth, FWidth, distance);
  44. inorout += distance.x;
  45. inorout = clamp(inorout, 0.0, 1.0);
  46. surfColor = mix(Yellow, Red, inorout);
  47. surfColor = mix(surfColor, Blue, distance.y);
  48. // normal = point on surface for sphere at (0,0,0)
  49. normal = p;
  50. // Per fragment diffuse lighting
  51. intensity = 0.2; // ambient
  52. intensity += 0.8 * clamp(dot(LightDir, normal), 0.0, 1.0);
  53. surfColor *= intensity;
  54. // Per fragment specular lighting
  55. intensity = clamp(dot(HVector, normal), 0.0, 1.0);
  56. intensity = pow(intensity, SpecularColor.a);
  57. surfColor += SpecularColor * intensity;
  58. gl_FragColor = surfColor;
  59. }