LZScene

Форк
0
/
GLSLToonShader.pas 
228 строк · 6.8 Кб
1
//
2
// This unit is part of the GLScene Engine https://github.com/glscene
3
//
4
{
5
   Toon shader : Toon shading also called Cell Shading
6
   At this time only one light source is supported
7

8
    History :  
9
     13/12/15 - J.Delauney - Creation
10

11
}
12
unit GLSLToonShader;
13

14
interface
15

16
//{$I GLScene.inc}
17

18
uses
19
  Classes,
20
   
21
  GLScene, GLCrossPlatform, GLBaseClasses, GLState, OpenGLTokens, OpenGL1x, GLContext, GLRenderContextInfo,
22
  GLVectorGeometry, GLCoordinates, GLTextureFormat,GLColor, GLTexture, GLMaterial,
23
  GLSLShader, GLCustomShader;
24

25
//TGLCustomGLSLToonShader
26
//
27
{ Custom class for GLSLToonShader.}
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

41

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

48
  protected
49
    procedure DoApply(var rci : TGLRenderContextInfo; Sender : TObject); override;
50
    function DoUnApply(var rci: TGLRenderContextInfo): Boolean; override;
51
  public
52
    constructor Create(AOwner : TComponent); override;
53
    destructor Destroy; override;
54

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;
60

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;
65

66
  end;
67

68
type
69
  TGLSLToonShader = class(TGLCustomGLSLToonShader)
70
  published
71
    property HighlightColor;
72
    property MidColor;
73
    property LightenShadowColor;
74
    property DarkenShadowrColor;
75
    property OutlinetColor;
76

77
    property HighlightSize;
78
    property MidSize;
79
    property ShadowSize;
80
    property OutlineWidth;
81
  end;
82

83
implementation
84

85

86
{ TGLCustomGLSLToonShader }
87

88
constructor TGLCustomGLSLToonShader.Create(AOwner: TComponent);
89
begin
90
  inherited;
91

92
  with VertexProgram.Code do
93
  begin
94
    Clear;
95
    Add('varying vec3 vNormal; ');
96
    Add('varying vec3 LightVec; ');
97
    Add('varying vec3 ViewVec; ');
98
    Add(' ');
99
    Add('void main() ');
100
    Add('{ ');
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(); ');
109
    Add('} ');
110
  end;
111

112
  with FragmentProgram.Code do
113
  begin
114
    Clear;
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; ');
120

121
    Add('uniform float HighlightSize; '); // 0.95
122
    Add('uniform float MidSize; ');       // 0.5
123
    Add('uniform float ShadowSize; ');    // 0.25
124

125
    Add('uniform float OutlineWidth; ');
126

127
    Add('varying vec3 vNormal; ');
128
    Add('varying vec3 LightVec; ');
129
    Add('varying vec3 ViewVec; ');
130

131
    Add('void main() ');
132
    Add('{ ');
133
    Add('  vec3 n = normalize(vNormal); ');
134
    Add('  vec3 l = normalize(LightVec); ');
135
    Add('  vec3 v = normalize(ViewVec); ');
136

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; ');
143

144
    Add('    if (dot(n,v)<OutlineWidth) colour = OutlineColor; ');
145

146
    Add('    gl_FragColor = colour; ');
147
    Add('} ');
148
  end;
149

150

151
  // Initial stuff.
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);
162

163
  FHighlightSize := 0.95;
164
  FMidSize       := 0.50;
165
  FShadowSize    := 0.25;
166
  FOutlineWidth  := 0.25;
167

168
end;
169

170
destructor TGLCustomGLSLToonShader.Destroy;
171
begin
172
  FHighLightColor.Free;
173
  FMidColor.Free;
174
  FLightenShadowColor.Free;
175
  FDarkenShadowColor.Free;
176
  FOutlineColor.Free;
177
  inherited;
178
end;
179

180
procedure TGLCustomGLSLToonShader.DoApply(var rci: TGLRenderContextInfo;Sender: TObject);
181
begin
182

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;
189

190
  param['HighlightSize'].AsVector1f := FHighlightSize;
191
  param['MidSize'].AsVector1f := FMidSize;
192
  param['ShadowSize'].AsVector1f := FShadowSize;
193
  param['OutlineWidth'].AsVector1f := FOutlineWidth;
194

195
end;
196

197
function TGLCustomGLSLToonShader.DoUnApply(var rci: TGLRenderContextInfo): Boolean;
198
begin
199
  GetGLSLProg.EndUseProgramObject;
200
  Result := False;
201
end;
202

203
procedure TGLCustomGLSLToonShader.SetHighlightColor(AValue: TGLColor);
204
begin
205
  FHighlightColor.DirectColor := AValue.Color;
206
end;
207

208
procedure TGLCustomGLSLToonShader.SetMidColor(AValue: TGLColor);
209
begin
210
  FMidColor.DirectColor := AValue.Color;
211
end;
212

213
procedure TGLCustomGLSLToonShader.SetLightenShadowColor(AValue: TGLColor);
214
begin
215
  FLightenShadowColor.DirectColor := AValue.Color;
216
end;
217

218
procedure TGLCustomGLSLToonShader.SetDarkenShadowColor(AValue: TGLColor);
219
begin
220
  FDarkenShadowColor.DirectColor := AValue.Color;
221
end;
222

223
procedure TGLCustomGLSLToonShader.SetOutlineColor(AValue: TGLColor);
224
begin
225
  FOutlineColor.DirectColor := AValue.Color;
226
end;
227

228
end.
229

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.