2
0

GLSL.ShaderToon.pas 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. //
  2. // This unit is part of the GLScene Engine, http://glscene.org
  3. //
  4. unit GLSL.ShaderToon;
  5. (*
  6. Toon shader : Toon shading also called Cell Shading
  7. At this time only one light source is supported
  8. *)
  9. interface
  10. {$I GLScene.inc}
  11. uses
  12. System.Classes,
  13. OpenGLTokens,
  14. GLScene,
  15. GLBaseClasses,
  16. GLState,
  17. GLContext,
  18. GLRenderContextInfo,
  19. GLVectorGeometry,
  20. GLCoordinates,
  21. GLTextureFormat,
  22. GLColor,
  23. GLTexture,
  24. GLMaterial,
  25. GLSL.Shader,
  26. GLS.ShaderCustom;
  27. // Custom class for GLSL.ShaderToon.
  28. type
  29. TGLCustomGLSLToonShader = class(TGLCustomGLSLShader)
  30. private
  31. FHighlightColor : TGLColor;
  32. FMidColor : TGLColor;
  33. FLightenShadowColor : TGLColor;
  34. FDarkenShadowColor : TGLColor;
  35. FOutlineColor : TGLColor;
  36. FHighlightSize : Single;
  37. FMidSize : Single;
  38. FShadowSize : Single;
  39. FOutlineWidth : Single;
  40. procedure SetHighLightColor(AValue: TGLColor);
  41. procedure SetMidColor(AValue: TGLColor);
  42. procedure SetLightenShadowColor(AValue: TGLColor);
  43. procedure SetDarkenShadowColor(AValue: TGLColor);
  44. procedure SetOutlineColor(AValue: TGLColor);
  45. protected
  46. procedure DoApply(var rci : TGLRenderContextInfo; Sender : TObject); override;
  47. function DoUnApply(var rci: TGLRenderContextInfo): Boolean; override;
  48. public
  49. constructor Create(AOwner : TComponent); override;
  50. destructor Destroy; override;
  51. property HighlightColor : TGLColor read FHighlightColor Write setHighlightColor;
  52. property MidColor : TGLColor read FMidColor Write setMidColor;
  53. property LightenShadowColor : TGLColor Read FLightenShadowColor Write setLightenShadowColor;
  54. property DarkenShadowrColor : TGLColor Read FDarkenShadowColor Write setDarkenShadowColor;
  55. property OutlinetColor : TGLColor Read FOutlineColor Write setOutlineColor;
  56. property HighlightSize : Single read FHighlightSize write FHighlightSize;
  57. property MidSize : Single read FMidSize write FMidSize;
  58. property ShadowSize : Single read FShadowSize write FShadowSize;
  59. property OutlineWidth : Single read FOutlineWidth write FOutlineWidth;
  60. end;
  61. type
  62. TGLSLToonShader = class(TGLCustomGLSLToonShader)
  63. published
  64. property HighlightColor;
  65. property MidColor;
  66. property LightenShadowColor;
  67. property DarkenShadowrColor;
  68. property OutlinetColor;
  69. property HighlightSize;
  70. property MidSize;
  71. property ShadowSize;
  72. property OutlineWidth;
  73. end;
  74. //==============================================================
  75. implementation
  76. //==============================================================
  77. //--------------------------------------
  78. // TGLCustomGLSLToonShader
  79. //--------------------------------------
  80. constructor TGLCustomGLSLToonShader.Create(AOwner: TComponent);
  81. begin
  82. inherited;
  83. with VertexProgram.Code do
  84. begin
  85. Clear;
  86. Add('varying vec3 vNormal; ');
  87. Add('varying vec3 LightVec; ');
  88. Add('varying vec3 ViewVec; ');
  89. Add(' ');
  90. Add('void main() ');
  91. Add('{ ');
  92. Add(' vec4 lightPos = gl_LightSource[0].position;');
  93. Add(' vec4 vert = gl_ModelViewMatrix * gl_Vertex; ');
  94. Add(' vec3 normal = gl_NormalMatrix * gl_Normal; ');
  95. Add(' vNormal = normalize(normal); ');
  96. Add(' LightVec = vec3(lightPos - vert); ');
  97. Add(' ViewVec = -vec3(vert); ');
  98. //Add(' gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; ');
  99. Add(' gl_Position = ftransform(); ');
  100. Add('} ');
  101. end;
  102. with FragmentProgram.Code do
  103. begin
  104. Clear;
  105. Add('uniform vec4 HighlightColor; ');
  106. Add('uniform vec4 MidColor; ');
  107. Add('uniform vec4 LightenShadowColor; ');
  108. Add('uniform vec4 DarkenShadowColor; ');
  109. Add('uniform vec4 OutlineColor; ');
  110. Add('uniform float HighlightSize; '); // 0.95
  111. Add('uniform float MidSize; '); // 0.5
  112. Add('uniform float ShadowSize; '); // 0.25
  113. Add('uniform float OutlineWidth; ');
  114. Add('varying vec3 vNormal; ');
  115. Add('varying vec3 LightVec; ');
  116. Add('varying vec3 ViewVec; ');
  117. Add('void main() ');
  118. Add('{ ');
  119. Add(' vec3 n = normalize(vNormal); ');
  120. Add(' vec3 l = normalize(LightVec); ');
  121. Add(' vec3 v = normalize(ViewVec); ');
  122. Add(' float lambert = dot(l,n); ');
  123. Add(' vec4 colour = MidColor; ');
  124. Add(' if (lambert>HighlightSize) colour = HighlightColor; ');
  125. Add(' else if (lambert>MidSize) colour = MidColor; ');
  126. Add(' else if (lambert>ShadowSize) colour = LightenShadowColor; ');
  127. Add(' else if (lambert<ShadowSize) colour = DarkenShadowColor; ');
  128. Add(' if (dot(n,v)<OutlineWidth) colour = OutlineColor; ');
  129. Add(' gl_FragColor = colour; ');
  130. Add('} ');
  131. end;
  132. // Initial stuff.
  133. FHighLightColor := TGLColor.Create(self);
  134. FHighLightColor.SetColor(0.9,0.9,0.9,1.0);
  135. FMidColor := TGLColor.Create(self);
  136. FMidColor.SetColor(0.75,0.75,0.75,1.0);
  137. FLightenShadowColor := TGLColor.Create(self);
  138. FLightenShadowColor.SetColor(0.5,0.5,0.5,1.0);
  139. FDarkenShadowColor := TGLColor.Create(self);
  140. FDarkenShadowColor.SetColor(0.3,0.3,0.3,1.0);
  141. FOutlineColor := TGLColor.Create(self);
  142. FOutlineColor.SetColor(0,0,0,1.0);
  143. FHighlightSize := 0.95;
  144. FMidSize := 0.50;
  145. FShadowSize := 0.25;
  146. FOutlineWidth := 0.25;
  147. end;
  148. destructor TGLCustomGLSLToonShader.Destroy;
  149. begin
  150. FHighLightColor.Free;
  151. FMidColor.Free;
  152. FLightenShadowColor.Free;
  153. FDarkenShadowColor.Free;
  154. FOutlineColor.Free;
  155. inherited;
  156. end;
  157. procedure TGLCustomGLSLToonShader.DoApply(var rci: TGLRenderContextInfo;Sender: TObject);
  158. begin
  159. GetGLSLProg.UseProgramObject;
  160. param['HighlightColor'].AsVector4f := FHighlightColor.Color;
  161. param['MidColor'].AsVector4f := FMidColor.Color;
  162. param['LightenShadowColor'].AsVector4f := FLightenShadowColor.Color;
  163. param['DarkenShadowColor'].AsVector4f := FDarkenShadowColor.Color;
  164. param['OutlineColor'].AsVector4f := FOutlineColor.Color;
  165. param['HighlightSize'].AsVector1f := FHighlightSize;
  166. param['MidSize'].AsVector1f := FMidSize;
  167. param['ShadowSize'].AsVector1f := FShadowSize;
  168. param['OutlineWidth'].AsVector1f := FOutlineWidth;
  169. end;
  170. function TGLCustomGLSLToonShader.DoUnApply(var rci: TGLRenderContextInfo): Boolean;
  171. begin
  172. GetGLSLProg.EndUseProgramObject;
  173. Result := False;
  174. end;
  175. procedure TGLCustomGLSLToonShader.SetHighlightColor(AValue: TGLColor);
  176. begin
  177. FHighlightColor.DirectColor := AValue.Color;
  178. end;
  179. procedure TGLCustomGLSLToonShader.SetMidColor(AValue: TGLColor);
  180. begin
  181. FMidColor.DirectColor := AValue.Color;
  182. end;
  183. procedure TGLCustomGLSLToonShader.SetLightenShadowColor(AValue: TGLColor);
  184. begin
  185. FLightenShadowColor.DirectColor := AValue.Color;
  186. end;
  187. procedure TGLCustomGLSLToonShader.SetDarkenShadowColor(AValue: TGLColor);
  188. begin
  189. FDarkenShadowColor.DirectColor := AValue.Color;
  190. end;
  191. procedure TGLCustomGLSLToonShader.SetOutlineColor(AValue: TGLColor);
  192. begin
  193. FOutlineColor.DirectColor := AValue.Color;
  194. end;
  195. end.