1
unit LUX.GPU.OpenGL.Matery.Preset;
3
interface //#################################################################### ■
5
uses System.SysUtils, System.UITypes,
6
Winapi.OpenGL, Winapi.OpenGLext,
9
LUX.GPU.OpenGL.Atom.Buffer.UniBuf,
10
LUX.GPU.OpenGL.Matery,
11
LUX.GPU.OpenGL.Matery.Textur.Preset;
13
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
15
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
17
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
19
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLMateryColor
21
IGLMateryColor = interface( IGLMatery )
22
['{F155A433-8EE7-45D5-A550-CA8E75677E0F}']
25
function GetColor :TAlphaColorF;
26
procedure SetColor( const Color_:TAlphaColorF );
29
property Color :TAlphaColorF read GetColor write SetColor;
32
//-------------------------------------------------------------------------
34
TGLMateryColor = class( TGLMatery, IGLMateryColor )
37
_Color :TGLUniBuf<TAlphaColorF>;
39
function GetColor :TAlphaColorF;
40
procedure SetColor( const Color_:TAlphaColorF );
43
destructor Destroy; override;
45
property Color :TAlphaColorF read GetColor write SetColor;
47
procedure Use; override;
48
procedure Unuse; override;
51
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLMateryRGB
53
IGLMateryRGB = interface( IGLMateryNor )
54
['{5729E984-EB08-43A2-A1DD-86A0A569D79C}']
57
function GetAmbient :TAlphaColorF;
58
procedure SetAmbient( const Ambient_:TAlphaColorF );
61
property Ambient :TAlphaColorF read GetAmbient write SetAmbient;
64
//-------------------------------------------------------------------------
66
TGLMateryRGB = class( TGLMateryNor, IGLMateryRGB )
69
_Ambient :TGLUniBuf<TAlphaColorF>;
71
function GetAmbient :TAlphaColorF;
72
procedure SetAmbient( const Ambient_:TAlphaColorF );
75
destructor Destroy; override;
77
property Ambient :TAlphaColorF read GetAmbient write SetAmbient;
79
procedure Use; override;
80
procedure Unuse; override;
83
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLMateryDiffuse
85
IGLMateryDiffuse = interface( IGLMateryNor )
86
['{8724B083-6A8B-43CA-8368-B60A28E26522}']
89
function GetAmbient :TAlphaColorF;
90
procedure SetAmbient( const Ambient_:TAlphaColorF );
93
property Ambient :TAlphaColorF read GetAmbient write SetAmbient;
96
//-------------------------------------------------------------------------
98
TGLMateryDiffuse = class( TGLMateryNor, IGLMateryDiffuse )
101
_Ambient :TGLUniBuf<TAlphaColorF>;
102
_Diffuse :TGLUniBuf<TAlphaColorF>;
104
function GetAmbient :TAlphaColorF;
105
procedure SetAmbient( const Ambient_:TAlphaColorF );
106
function GetDiffuse :TAlphaColorF;
107
procedure SetDiffuse( const Diffuse_:TAlphaColorF );
110
destructor Destroy; override;
112
property Ambient :TAlphaColorF read GetAmbient write SetAmbient;
113
property Diffuse :TAlphaColorF read GetDiffuse write SetDiffuse;
115
procedure Use; override;
116
procedure Unuse; override;
119
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLMateryPlastic
121
IGLMateryPlastic = interface( IGLMateryImag )
122
['{6BFC6C55-3773-424E-8140-EAB4F4812101}']
125
function GetAmbient :TAlphaColorF;
126
procedure SetAmbient( const Ambient_:TAlphaColorF );
127
function GetDiffuse :TAlphaColorF;
128
procedure SetDiffuse( const Diffuse_:TAlphaColorF );
129
function GetRefI :Single;
130
procedure SetRefI( const RefI_:Single );
133
property Ambient :TAlphaColorF read GetAmbient write SetAmbient;
134
property Diffuse :TAlphaColorF read GetDiffuse write SetDiffuse;
135
property RefI :Single read GetRefI write SetRefI ;
138
//-------------------------------------------------------------------------
140
TGLMateryPlastic = class( TGLMateryImag, IGLMateryPlastic )
143
_Ambient :TGLUniBuf<TAlphaColorF>;
144
_Diffuse :TGLUniBuf<TAlphaColorF>;
145
_RefI :TGLUniBuf<Single>;
147
function GetAmbient :TAlphaColorF;
148
procedure SetAmbient( const Ambient_:TAlphaColorF );
149
function GetDiffuse :TAlphaColorF;
150
procedure SetDiffuse( const Diffuse_:TAlphaColorF );
151
function GetRefI :Single;
152
procedure SetRefI( const RefI_:Single );
155
destructor Destroy; override;
157
property Ambient :TAlphaColorF read GetAmbient write SetAmbient;
158
property Diffuse :TAlphaColorF read GetDiffuse write SetDiffuse;
159
property RefI :Single read GetRefI write SetRefI ;
161
procedure Use; override;
162
procedure Unuse; override;
165
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLMateryMirror
167
IGLMateryMirror = interface( IGLMateryImag )
168
['{2B1DD157-1296-4201-8285-8063CCF6CD03}']
171
function GetColor :TAlphaColorF;
172
procedure SetColor( const Color_:TAlphaColorF );
175
property Color :TAlphaColorF read GetColor write SetColor;
178
//-------------------------------------------------------------------------
180
TGLMateryMirror = class( TGLMateryImag, IGLMateryMirror )
183
_Color :TGLUniBuf<TAlphaColorF>;
185
function GetColor :TAlphaColorF;
186
procedure SetColor( const Color_:TAlphaColorF );
189
destructor Destroy; override;
191
property Color :TAlphaColorF read GetColor write SetColor;
193
procedure Use; override;
194
procedure Unuse; override;
197
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLMateryGlass
199
IGLMateryGlass = interface( IGLMateryImag )
200
['{960FE1E6-E27F-499A-BFB3-EA2C72DA09A5}']
203
function GetRefI :Single;
204
procedure SetRefI( const RefI_:Single );
207
property RefI :Single read GetRefI write SetRefI;
210
//-------------------------------------------------------------------------
212
TGLMateryGlass = class( TGLMateryImag, IGLMateryGlass )
215
_RefI :TGLUniBuf<Single>;
217
function GetRefI :Single;
218
procedure SetRefI( const RefI_:Single );
221
destructor Destroy; override;
223
property RefI :Single read GetRefI write SetRefI;
225
procedure Use; override;
226
procedure Unuse; override;
229
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
231
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
233
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
235
implementation //############################################################### ■
237
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
239
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
241
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLMateryColor
243
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
245
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
247
/////////////////////////////////////////////////////////////////////// アクセス
249
function TGLMateryColor.GetColor :TAlphaColorF;
251
Result := _Color[ 0 ];
254
procedure TGLMateryColor.SetColor( const Color_:TAlphaColorF );
256
_Color[ 0 ] := Color_;
259
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
261
constructor TGLMateryColor.Create;
265
_Color := TGLUniBuf<TAlphaColorF>.Create( GL_STATIC_DRAW );
274
Add( '#version 430' );
276
Add( 'layout( std140 ) uniform TMateryCol{ vec4 _MateryCol; };' );
278
Add( 'in TSenderVF' );
284
Add( 'out vec4 _ResultCol;' );
286
Add( 'void main(){ _ResultCol = _MateryCol; }' );
291
Assert( Status, Errors.Text );
298
Add( 4{BinP}, 'TMateryCol'{Name} );
302
Color := TAlphaColorF.Create( 1, 0, 0, 1 );
305
destructor TGLMateryColor.Destroy;
312
/////////////////////////////////////////////////////////////////////// メソッド
314
procedure TGLMateryColor.Use;
321
procedure TGLMateryColor.Unuse;
328
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLMateryRGB
330
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
332
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
334
/////////////////////////////////////////////////////////////////////// アクセス
336
function TGLMateryRGB.GetAmbient :TAlphaColorF;
338
Result := _Ambient[ 0 ];
341
procedure TGLMateryRGB.SetAmbient( const Ambient_:TAlphaColorF );
343
_Ambient[ 0 ] := Ambient_;
346
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
348
constructor TGLMateryRGB.Create;
352
_Ambient := TGLUniBuf<TAlphaColorF>.Create( GL_STATIC_DRAW );
361
Add( '#version 430' );
363
Add( 'layout( std140 ) uniform TAmbient{ vec4 _Ambient; };' );
365
Add( 'in TSenderVF' );
372
Add( 'out vec4 _ResultCol;' );
374
Add( 'void main()' );
376
Add( ' _ResultCol = vec4( _Ambient.rgb + ( 1 + normalize( _Sender.Nor.xyz ) ) / 2, 1 );' );
382
Assert( Status, Errors.Text );
389
Add( 4{BinP}, 'TAmbient'{Name} );
393
Ambient := TAlphaColorF.Create( 0, 0, 0 );
396
destructor TGLMateryRGB.Destroy;
403
/////////////////////////////////////////////////////////////////////// メソッド
405
procedure TGLMateryRGB.Use;
412
procedure TGLMateryRGB.Unuse;
419
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLMateryDiffuse
421
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
423
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
425
/////////////////////////////////////////////////////////////////////// アクセス
427
function TGLMateryDiffuse.GetAmbient :TAlphaColorF;
429
Result := _Ambient[ 0 ];
432
procedure TGLMateryDiffuse.SetAmbient( const Ambient_:TAlphaColorF );
434
_Ambient[ 0 ] := Ambient_;
437
function TGLMateryDiffuse.GetDiffuse :TAlphaColorF;
439
Result := _Diffuse[ 0 ];
442
procedure TGLMateryDiffuse.SetDiffuse( const Diffuse_:TAlphaColorF );
444
_Diffuse[ 0 ] := Diffuse_;
447
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
449
constructor TGLMateryDiffuse.Create;
453
_Ambient := TGLUniBuf<TAlphaColorF>.Create( GL_STATIC_DRAW );
454
_Diffuse := TGLUniBuf<TAlphaColorF>.Create( GL_STATIC_DRAW );
463
Add( '#version 430' );
465
Add( 'layout( std140 ) uniform TAmbient{ vec4 _Ambient; };' );
466
Add( 'layout( std140 ) uniform TDiffuse{ vec4 _Diffuse; };' );
468
Add( 'in TSenderVF' );
475
Add( 'out vec4 _ResultCol;' );
477
Add( 'void main()' );
479
Add( ' vec3 L = normalize( vec3( 0, 1, 1 ) );' );
480
Add( ' vec3 N = normalize( _Sender.Nor.xyz );' );
481
Add( ' _ResultCol = vec4( _Ambient.rgb + _Diffuse.rgb * max( dot( L, N ), 0 ), 1 );' );
487
Assert( Status, Errors.Text );
494
Add( 4{BinP}, 'TAmbient'{Name} );
495
Add( 5{BinP}, 'TDiffuse'{Name} );
499
Ambient := TAlphaColorF.Create( 0, 0, 0 );
500
Diffuse := TAlphaColorF.Create( 1, 1, 1 );
503
destructor TGLMateryDiffuse.Destroy;
511
/////////////////////////////////////////////////////////////////////// メソッド
513
procedure TGLMateryDiffuse.Use;
521
procedure TGLMateryDiffuse.Unuse;
529
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLMateryPlastic
531
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
533
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
535
/////////////////////////////////////////////////////////////////////// アクセス
537
function TGLMateryPlastic.GetAmbient :TAlphaColorF;
539
Result := _Ambient[ 0 ];
542
procedure TGLMateryPlastic.SetAmbient( const Ambient_:TAlphaColorF );
544
_Ambient[ 0 ] := Ambient_;
547
//------------------------------------------------------------------------------
549
function TGLMateryPlastic.GetDiffuse :TAlphaColorF;
551
Result := _Diffuse[ 0 ];
554
procedure TGLMateryPlastic.SetDiffuse( const Diffuse_:TAlphaColorF );
556
_Diffuse[ 0 ] := Diffuse_;
559
//------------------------------------------------------------------------------
561
function TGLMateryPlastic.GetRefI :Single;
563
Result := _RefI[ 0 ];
566
procedure TGLMateryPlastic.SetRefI( const RefI_:Single );
571
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
573
constructor TGLMateryPlastic.Create;
577
_Ambient := TGLUniBuf<TAlphaColorF>.Create( GL_STATIC_DRAW );
578
_Diffuse := TGLUniBuf<TAlphaColorF>.Create( GL_STATIC_DRAW );
579
_RefI := TGLUniBuf<Single>.Create( GL_STATIC_DRAW );
588
Add( '#version 430' );
590
Add( 'const float Pi = 3.141592653589793;' );
591
Add( 'const float Pi2 = Pi * 2.0;' );
593
Add( 'vec2 VecToSky( vec4 Vector_ )' );
595
Add( ' vec2 Result;' );
597
Add( ' Result.x = ( Pi - atan( -Vector_.x, -Vector_.z ) ) / Pi2;' );
598
Add( ' Result.y = acos( Vector_.y ) / Pi ;' );
600
Add( ' return Result;' );
603
Add( 'float Pow2( float X_ )' );
605
Add( ' return X_ * X_;' );
608
Add( 'float Fresnel( vec4 EyeVec_, vec4 NorVec_, float RefI_ )' );
610
Add( ' float N = Pow2( RefI_ );' );
611
Add( ' float C = dot( EyeVec_, NorVec_ );' );
612
Add( ' float G = sqrt( N + Pow2( C ) - 1 );' );
613
Add( ' float NC = N * C;' );
614
Add( ' return ( Pow2( ( C - G ) / ( C + G ) )' );
615
Add( ' + Pow2( ( NC - G ) / ( NC + G ) ) ) / 2;' );
618
Add( 'layout( std140 ) uniform TViewerScal{ layout( row_major ) mat4 _ViewerScal; };' );
619
Add( 'layout( std140 ) uniform TCameraProj{ layout( row_major ) mat4 _CameraProj; };' );
620
Add( 'layout( std140 ) uniform TCameraPose{ layout( row_major ) mat4 _CameraPose; };' );
621
Add( 'layout( std140 ) uniform TShaperPose{ layout( row_major ) mat4 _ShaperPose; };' );
623
Add( 'uniform sampler2D _Textur;' );
625
Add( 'layout( std140 ) uniform TAmbient{ vec4 _Ambient; };' );
626
Add( 'layout( std140 ) uniform TDiffuse{ vec4 _Diffuse; };' );
627
Add( 'layout( std140 ) uniform TRefI { float _RefI; };' );
629
Add( 'in TSenderVF' );
637
Add( 'out vec4 _ResultCol;' );
639
Add( 'void main()' );
641
Add( ' vec4 C = _CameraPose[ 3 ];' );
642
Add( ' vec4 V = normalize( _Sender.Pos - C );' );
643
Add( ' vec4 N = normalize( _Sender.Nor );' );
644
Add( ' vec4 R = reflect( V, N );' );
646
Add( ' vec4 Cd = _Diffuse * N.y;' );
647
Add( ' vec4 Cr = texture( _Textur, VecToSky( R ) );' );
649
Add( 'float F = clamp( Fresnel( -V, N, _RefI ), 0, 1 );' );
651
Add( ' _ResultCol = _Ambient + ( Cr - Cd ) * F + Cd;' );
652
Add( ' _ResultCol.a = 1;' );
658
Assert( Status, Errors.Text );
665
Add( 4{BinP}, 'TAmbient'{Name} );
666
Add( 5{BinP}, 'TDiffuse'{Name} );
667
Add( 6{BinP}, 'TRefI'{Name} );
671
Ambient := TAlphaColorF.Create( 0.1, 0.1, 0.1 );
672
Diffuse := TAlphaColorF.Create( 1, 1, 1 );
676
destructor TGLMateryPlastic.Destroy;
685
/////////////////////////////////////////////////////////////////////// メソッド
687
procedure TGLMateryPlastic.Use;
696
procedure TGLMateryPlastic.Unuse;
705
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLMateryMirror
707
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
709
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
711
/////////////////////////////////////////////////////////////////////// アクセス
713
function TGLMateryMirror.GetColor :TAlphaColorF;
715
Result := _Color[ 0 ];
718
procedure TGLMateryMirror.SetColor( const Color_:TAlphaColorF );
720
_Color[ 0 ] := Color_;
723
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
725
constructor TGLMateryMirror.Create;
729
_Color := TGLUniBuf<TAlphaColorF>.Create( GL_STATIC_DRAW );
738
Add( '#version 430' );
740
Add( 'const float Pi = 3.141592653589793;' );
741
Add( 'const float Pi2 = Pi * 2.0;' );
743
Add( 'vec2 VecToSky( vec4 Vector_ )' );
745
Add( ' vec2 Result;' );
747
Add( ' Result.x = ( Pi - atan( -Vector_.x, -Vector_.z ) ) / Pi2;' );
748
Add( ' Result.y = acos( Vector_.y ) / Pi ;' );
750
Add( ' return Result;' );
753
Add( 'layout( std140 ) uniform TViewerScal{ layout( row_major ) mat4 _ViewerScal; };' );
754
Add( 'layout( std140 ) uniform TCameraProj{ layout( row_major ) mat4 _CameraProj; };' );
755
Add( 'layout( std140 ) uniform TCameraPose{ layout( row_major ) mat4 _CameraPose; };' );
756
Add( 'layout( std140 ) uniform TShaperPose{ layout( row_major ) mat4 _ShaperPose; };' );
758
Add( 'uniform sampler2D _Textur;' );
760
Add( 'layout( std140 ) uniform TColor{ vec4 _Color; };' );
762
Add( 'in TSenderVF' );
770
Add( 'out vec4 _ResultCol;' );
772
Add( 'void main()' );
774
Add( ' vec4 C = _CameraPose[ 3 ];' );
775
Add( ' vec4 V = normalize( _Sender.Pos - C );' );
776
Add( ' vec4 N = normalize( _Sender.Nor );' );
777
Add( ' vec4 R = reflect( V, N );' );
778
Add( ' _ResultCol = _Color * texture( _Textur, VecToSky( R ) );' );
784
Assert( Status, Errors.Text );
791
Add( 4{BinP}, 'TColor'{Name} );
795
Color := TAlphaColorF.Create( 1, 1, 1 );
798
destructor TGLMateryMirror.Destroy;
805
/////////////////////////////////////////////////////////////////////// メソッド
807
procedure TGLMateryMirror.Use;
814
procedure TGLMateryMirror.Unuse;
821
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLMateryGlass
823
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
825
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
827
/////////////////////////////////////////////////////////////////////// アクセス
829
function TGLMateryGlass.GetRefI :Single;
831
Result := _RefI[ 0 ];
834
procedure TGLMateryGlass.SetRefI( const RefI_:Single );
839
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
841
constructor TGLMateryGlass.Create;
845
_RefI := TGLUniBuf<Single>.Create( GL_STATIC_DRAW );
854
Add( '#version 430' );
856
Add( 'const float Pi = 3.141592653589793;' );
857
Add( 'const float Pi2 = Pi * 2.0;' );
859
Add( 'vec2 VecToSky( vec4 Vector_ )' );
861
Add( ' vec2 Result;' );
863
Add( ' Result.x = ( Pi - atan( -Vector_.x, -Vector_.z ) ) / Pi2;' );
864
Add( ' Result.y = acos( Vector_.y ) / Pi ;' );
866
Add( ' return Result;' );
869
Add( 'float Pow2( float X_ )' );
871
Add( ' return X_ * X_;' );
874
Add( 'float Fresnel( vec4 EyeVec_, vec4 NorVec_, float RefI_ )' );
876
Add( ' float N = Pow2( RefI_ );' );
877
Add( ' float C = dot( EyeVec_, NorVec_ );' );
878
Add( ' float G = sqrt( N + Pow2( C ) - 1 );' );
879
Add( ' float NC = N * C;' );
880
Add( ' return ( Pow2( ( C - G ) / ( C + G ) )' );
881
Add( ' + Pow2( ( NC - G ) / ( NC + G ) ) ) / 2;' );
884
Add( 'layout( std140 ) uniform TViewerScal{ layout( row_major ) mat4 _ViewerScal; };' );
885
Add( 'layout( std140 ) uniform TCameraProj{ layout( row_major ) mat4 _CameraProj; };' );
886
Add( 'layout( std140 ) uniform TCameraPose{ layout( row_major ) mat4 _CameraPose; };' );
887
Add( 'layout( std140 ) uniform TShaperPose{ layout( row_major ) mat4 _ShaperPose; };' );
889
Add( 'uniform sampler2D _Textur;' );
891
Add( 'layout( std140 ) uniform TRefI{ float _RefI; };' );
893
Add( 'in TSenderVF' );
901
Add( 'out vec4 _ResultCol;' );
903
Add( 'void main()' );
905
Add( ' vec4 C = _CameraPose[ 3 ];' );
906
Add( ' vec4 V = normalize( _Sender.Pos - C );' );
907
Add( ' vec4 N = normalize( _Sender.Nor );' );
908
Add( ' vec4 Re = reflect( V, N );' );
909
Add( ' vec4 Ra = refract( V, N, 1.0/_RefI );' );
911
Add( ' vec4 Ce = texture( _Textur, VecToSky( Re ) );' );
912
Add( ' vec4 Ca = texture( _Textur, VecToSky( Ra ) );' );
914
Add( 'float F = clamp( Fresnel( -V, N, _RefI ), 0, 1 );' );
916
Add( ' _ResultCol = ( Ce - Ca ) * F + Ca;' );
917
Add( ' _ResultCol.a = 1;' );
923
Assert( Status, Errors.Text );
930
Add( 4{BinP}, 'TRefI'{Name} );
937
destructor TGLMateryGlass.Destroy;
944
/////////////////////////////////////////////////////////////////////// メソッド
946
procedure TGLMateryGlass.Use;
953
procedure TGLMateryGlass.Unuse;
960
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
962
//############################################################################## □
964
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
966
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
968
end. //######################################################################### ■