LZScene

Форк
0
/
GLSLIvoryShader.pas 
126 строк · 3.0 Кб
1
//
2
// This unit is part of the GLScene Engine https://github.com/glscene
3
//
4
{
5
   Ivory shader simulate Ivory material.
6
   At this time only one light source is supported
7

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

11
}
12

13
unit GLSLIvoryShader;
14

15
interface
16

17
{$I GLScene.inc}
18

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

27
//TGLCustomGLSLIvoryShader
28
//
29
{ Custom class for GLSLIvoryShader.
30
 A shader that simulate Ivory Material }
31
type
32
  TGLCustomGLSLIvoryShader = class(TGLCustomGLSLShader)
33
  private
34

35
  protected
36
    procedure DoApply(var rci : TGLRenderContextInfo; Sender : TObject); override;
37
    function DoUnApply(var rci: TGLRenderContextInfo): Boolean; override;
38
  public
39
    constructor Create(AOwner : TComponent); override;
40
    destructor Destroy; override;
41

42
  end;
43

44
type
45
  TGLSLIvoryShader = class(TGLCustomGLSLIvoryShader)
46

47
  end;
48

49
implementation
50

51

52
{ TGLCustomGLSLIvoryShader }
53

54
constructor TGLCustomGLSLIvoryShader.Create(AOwner: TComponent);
55
begin
56
  inherited;
57

58
  with VertexProgram.Code do
59
  begin
60
    Clear;
61
    Add('varying vec3 normal; ');
62
    Add('varying vec3 lightVec; ');
63
    Add('varying vec3 viewVec; ');
64
    Add(' ');
65
    Add('void main() ');
66
    Add('{ ');
67
    Add('  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; ');
68
    Add('  vec4 lightPos = gl_LightSource[0].position;');
69
    Add('  vec4 vert =  gl_ModelViewMatrix * gl_Vertex; ');
70
    Add('  normal = gl_NormalMatrix * gl_Normal; ');
71
    Add('  lightVec = vec3(lightPos - vert); ');
72
    Add('  viewVec = -vec3(vert); ');
73
    Add('} ');
74
  end;
75

76
  with FragmentProgram.Code do
77
  begin
78
    Clear;
79
    Add('varying vec3 normal; ');
80
    Add('varying vec3 lightVec; ');
81
    Add('varying vec3 viewVec; ');
82
    Add(' ');
83
    Add('void main() ');
84
    Add('{ ');
85
    Add('vec3 norm = normalize(normal); ');
86
    Add('vec3 L = normalize(lightVec); ');
87
    Add('vec3 V = normalize(viewVec); ');
88
    Add('vec3 halfAngle = normalize(L + V); ');
89
    Add('float NdotL = dot(L, norm); ');
90
    Add('float NdotH = clamp(dot(halfAngle, norm), 0.0, 1.0); ');
91
    Add('// "Half-Lambert" technique for more pleasing diffuse term ');
92
    Add('float diffuse = 0.5 * NdotL + 0.5; ');
93
    Add('float specular = pow(NdotH, 64.0); ');
94
    Add('float result = diffuse + specular; ');
95
    Add('gl_FragColor = vec4(result); ');
96
    Add('} ');
97
  end;
98

99

100
  // Initial stuff.
101

102
end;
103

104
destructor TGLCustomGLSLIvoryShader.Destroy;
105
begin
106

107
  inherited;
108
end;
109

110
procedure TGLCustomGLSLIvoryShader.DoApply(var rci: TGLRenderContextInfo;
111
  Sender: TObject);
112
begin
113
  GetGLSLProg.UseProgramObject;
114

115
end;
116

117
function TGLCustomGLSLIvoryShader.DoUnApply(
118
  var rci: TGLRenderContextInfo): Boolean;
119
begin
120
  Result := False;
121
  GetGLSLProg.EndUseProgramObject;
122
end;
123

124

125

126
end.
127

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

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

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

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