2
// This unit is part of the GLScene Engine https://github.com/glscene
5
Toon shader : Toon shading also called Cell Shading
6
At this time only one light source is supported
9
13/12/15 - J.Delauney - Creation
21
GLScene, GLCrossPlatform, GLBaseClasses, GLState, OpenGLTokens, OpenGL1x, GLContext, GLRenderContextInfo,
22
GLVectorGeometry, GLCoordinates, GLTextureFormat,GLColor, GLTexture, GLMaterial,
23
GLSLShader, GLCustomShader;
25
//TGLCustomGLSLToonShader
27
{ Custom class for GLSLToonShader.}
29
TGLCustomGLSLToonShader = class(TGLCustomGLSLShader)
31
FHighlightColor : TGLColor;
33
FLightenShadowColor : TGLColor;
34
FDarkenShadowColor : TGLColor;
35
FOutlineColor : TGLColor;
36
FHighlightSize : Single;
39
FOutlineWidth : Single;
42
procedure SetHighLightColor(AValue: TGLColor);
43
procedure SetMidColor(AValue: TGLColor);
44
procedure SetLightenShadowColor(AValue: TGLColor);
45
procedure SetDarkenShadowColor(AValue: TGLColor);
46
procedure SetOutlineColor(AValue: TGLColor);
49
procedure DoApply(var rci : TGLRenderContextInfo; Sender : TObject); override;
50
function DoUnApply(var rci: TGLRenderContextInfo): Boolean; override;
52
constructor Create(AOwner : TComponent); override;
53
destructor Destroy; override;
55
property HighlightColor : TGLColor read FHighlightColor Write setHighlightColor;
56
property MidColor : TGLColor read FMidColor Write setMidColor;
57
property LightenShadowColor : TGLColor Read FLightenShadowColor Write setLightenShadowColor;
58
property DarkenShadowrColor : TGLColor Read FDarkenShadowColor Write setDarkenShadowColor;
59
property OutlinetColor : TGLColor Read FOutlineColor Write setOutlineColor;
61
property HighlightSize : Single read FHighlightSize write FHighlightSize;
62
property MidSize : Single read FMidSize write FMidSize;
63
property ShadowSize : Single read FShadowSize write FShadowSize;
64
property OutlineWidth : Single read FOutlineWidth write FOutlineWidth;
69
TGLSLToonShader = class(TGLCustomGLSLToonShader)
71
property HighlightColor;
73
property LightenShadowColor;
74
property DarkenShadowrColor;
75
property OutlinetColor;
77
property HighlightSize;
80
property OutlineWidth;
86
{ TGLCustomGLSLToonShader }
88
constructor TGLCustomGLSLToonShader.Create(AOwner: TComponent);
92
with VertexProgram.Code do
95
Add('varying vec3 vNormal; ');
96
Add('varying vec3 LightVec; ');
97
Add('varying vec3 ViewVec; ');
101
Add(' vec4 lightPos = gl_LightSource[0].position;');
102
Add(' vec4 vert = gl_ModelViewMatrix * gl_Vertex; ');
103
Add(' vec3 normal = gl_NormalMatrix * gl_Normal; ');
104
Add(' vNormal = normalize(normal); ');
105
Add(' LightVec = vec3(lightPos - vert); ');
106
Add(' ViewVec = -vec3(vert); ');
107
//Add(' gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; ');
108
Add(' gl_Position = ftransform(); ');
112
with FragmentProgram.Code do
115
Add('uniform vec4 HighlightColor; ');
116
Add('uniform vec4 MidColor; ');
117
Add('uniform vec4 LightenShadowColor; ');
118
Add('uniform vec4 DarkenShadowColor; ');
119
Add('uniform vec4 OutlineColor; ');
121
Add('uniform float HighlightSize; '); // 0.95
122
Add('uniform float MidSize; '); // 0.5
123
Add('uniform float ShadowSize; '); // 0.25
125
Add('uniform float OutlineWidth; ');
127
Add('varying vec3 vNormal; ');
128
Add('varying vec3 LightVec; ');
129
Add('varying vec3 ViewVec; ');
133
Add(' vec3 n = normalize(vNormal); ');
134
Add(' vec3 l = normalize(LightVec); ');
135
Add(' vec3 v = normalize(ViewVec); ');
137
Add(' float lambert = dot(l,n); ');
138
Add(' vec4 colour = MidColor; ');
139
Add(' if (lambert>HighlightSize) colour = HighlightColor; ');
140
Add(' else if (lambert>MidSize) colour = MidColor; ');
141
Add(' else if (lambert>ShadowSize) colour = LightenShadowColor; ');
142
Add(' else if (lambert<ShadowSize) colour = DarkenShadowColor; ');
144
Add(' if (dot(n,v)<OutlineWidth) colour = OutlineColor; ');
146
Add(' gl_FragColor = colour; ');
152
FHighLightColor := TGLColor.Create(self);
153
FHighLightColor.SetColor(0.9,0.9,0.9,1.0);
154
FMidColor := TGLColor.Create(self);
155
FMidColor.SetColor(0.75,0.75,0.75,1.0);
156
FLightenShadowColor := TGLColor.Create(self);
157
FLightenShadowColor.SetColor(0.5,0.5,0.5,1.0);
158
FDarkenShadowColor := TGLColor.Create(self);
159
FDarkenShadowColor.SetColor(0.3,0.3,0.3,1.0);
160
FOutlineColor := TGLColor.Create(self);
161
FOutlineColor.SetColor(0,0,0,1.0);
163
FHighlightSize := 0.95;
166
FOutlineWidth := 0.25;
170
destructor TGLCustomGLSLToonShader.Destroy;
172
FHighLightColor.Free;
174
FLightenShadowColor.Free;
175
FDarkenShadowColor.Free;
180
procedure TGLCustomGLSLToonShader.DoApply(var rci: TGLRenderContextInfo;Sender: TObject);
183
GetGLSLProg.UseProgramObject;
184
param['HighlightColor'].AsVector4f := FHighlightColor.Color;
185
param['MidColor'].AsVector4f := FMidColor.Color;
186
param['LightenShadowColor'].AsVector4f := FLightenShadowColor.Color;
187
param['DarkenShadowColor'].AsVector4f := FDarkenShadowColor.Color;
188
param['OutlineColor'].AsVector4f := FOutlineColor.Color;
190
param['HighlightSize'].AsVector1f := FHighlightSize;
191
param['MidSize'].AsVector1f := FMidSize;
192
param['ShadowSize'].AsVector1f := FShadowSize;
193
param['OutlineWidth'].AsVector1f := FOutlineWidth;
197
function TGLCustomGLSLToonShader.DoUnApply(var rci: TGLRenderContextInfo): Boolean;
199
GetGLSLProg.EndUseProgramObject;
203
procedure TGLCustomGLSLToonShader.SetHighlightColor(AValue: TGLColor);
205
FHighlightColor.DirectColor := AValue.Color;
208
procedure TGLCustomGLSLToonShader.SetMidColor(AValue: TGLColor);
210
FMidColor.DirectColor := AValue.Color;
213
procedure TGLCustomGLSLToonShader.SetLightenShadowColor(AValue: TGLColor);
215
FLightenShadowColor.DirectColor := AValue.Color;
218
procedure TGLCustomGLSLToonShader.SetDarkenShadowColor(AValue: TGLColor);
220
FDarkenShadowColor.DirectColor := AValue.Color;
223
procedure TGLCustomGLSLToonShader.SetOutlineColor(AValue: TGLColor);
225
FOutlineColor.DirectColor := AValue.Color;